pytorch dataset读取数据流程_动手学习深度学习Pytorch——线性回归
最近参加了Datawhale组织的新一轮公益学习,这本书买了很久但是没看,顺便复现提高pytorch和python的编程能力!嗯这就是我的目标,废话不多说,直接开撸!
python part:
# define a timer class to record time
用类来定义一个计时器Timer,组成部分是times一个空数组[],start()这个函数。
start()这个函数生成一个start_time值是time.time(),time.time()返回当前时间的时间戳(1970纪元后经过的浮点秒数),也就是现在到1970有多少多少秒。
stop()这个函数是在times这个数组后面加一个time.time() - self.start_time,也就是start()到stop()这两个函数启动的时间相差了多少秒, return self.times[-1]返回times的最后一个元素,也就是返回的是最近一次的stop()到最近一次start()的时间间隔。
avg()这个函数return sum(self.times)/len(self.times),由上面我们可以知道times这个数组记录的是每次使用start()和stop()的时间间隔,于是求和再除于长度就是多次时间间隔的平均。
sum()这个函数return sum(self.times),因此就是总耗时了。
小结:
这个Timer类是这样使用的
#实例化Timer类
pytorch part:
这部分代码是用于人造数据的
num_inputs
features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
torch.tensor(size,dtype)——主要就是两个参数多大的,什么类型的
为什么要用torch.tensor?——理解成这是pytorch框架下的计算单元,类比线性空间中的向量才能运算哦。
np.random.normal(μ, σ, (多少个, 多少维))——记忆:random随机,normal正态分布,之后就很好理解了吧,也就是什么正态分布的随机数,要给什么正态分布——N(μ, σ),多少个随机数——(多少个, 多少维)。
例子:
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
可以理解成算y = Xβ+b,首先features一定是个类似上面那个图的a那个样的一个1000(条)*2(维)的tensor。
features[:, 0]就是类似下图这种概念,红色箭头说明我们有2行,蓝色箭头说明我们有3列,[:,0]中的冒号是行我全都要,于是所有行都有绿色的箭头飞了出去,0代表我只要第一列,于是只要第一列有绿色箭头飞出去,所有绿色箭头相交的黄色勾勾就是我们要的tensor,这其实是python的一种数组筛选的方法。
由于我们是在pytorch这个框架下进行运算,所以我们要屈服于它的规则,首先它需要将数据转换成一个叫data.DataLoader的东西才行。
import
我们看到Data.DataLoader下面有4个参数:
- dataset,首先你得指定一个数据集吧。
- batch_size,用这里的例子来说就是我们前面已经生产了1000条2维的数据了,我每次训练是1条1条算,还是10条10条算。batch_size越大你算的越快,但是要求的内存就变多了,因为你每次算的数多了。为什么说1条1条可以算,10条10条也可以算,我们假设大家都知道线性回归的所使用的算法是随机梯度下降,损失函数是MSE均方误差,你一条算出损失算一次梯度当然可以,我10条算一次损失也可以不是吗?
- shuffle,就是说这1000条数据是否要打乱输入。
- num_workers我个人理解就是需不需要多线程读取数据,可以加快读取数据的速度。
看一下data_iter是啥东西,是一个可迭代对象(好专业的名字,当成是发牌器好了,有两副牌一个是X,一个是y,可以一直发)
接下来就进入到pytorch优势的地方了,它不用你花时间去定义那个y = Xβ+b,搞那些数组之间的运算只要你定义一个神经网络类就可以完成。
class
nn.Linear(输入size, 输出size),这个nn.Linear就是如此方便,但凡你要做y = Xβ+b的线性运算,只要控制上面两个参数就可以了,默认带b,也就是bias偏移项。而且它会自己初始化好参数,非常人性化。
定义好这些那我们就可以开始训练了
第一步:定义损失函数
loss = nn.MSELoss()
第二部:定于迭代算法
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.03)
第三步:训练
num_epochs
当然你也可以这样测试你的模型