d2l.stnthetic_data
函数synthetic_data(w, b, num_example)
生成x, y满足关系 y = X w + b + n o i s e y = Xw+b+noise y=Xw+b+noise
data.TensorDataset()
TensorDataset 可以用来对 tensor 进行打包,包装成dataset。就好像 python 中的 zip 功能。该类通过每一个 tensor 的第一个维度进行索引。因此,该类中的 tensor 第一维度必须相等. 另外:TensorDataset 中的参数必须是 tensor
DataLoader
data_iter=torch.utils.data.DataLoader(dataset, batch_size=1,
shuffle=False, sampler=None,
batch_sampler=None, num_workers=0,
collate_fn=None, pin_memory=False,
drop_last=False, timeout=0,
worker_init_fn=None,
multiprocessing_context=None)
dataset (Dataset) – 加载数据的数据集。
batch_size (int, optional) – 每个batch加载多少个样本(默认: 1)。
shuffle (bool, optional) – 设置为True时会在每个epoch重新打乱数据(默认: False).
sampler (Sampler, optional) – 定义从数据集中提取样本的策略。如果指定,则shuffle必须设置成False。
num_workers (int, optional) – 用多少个子进程加载数据。0表示数据将在主进程中加载(默认: 0)
pin_memory:内存寄存,默认为False。在数据返回前,是否将数据复制到CUDA内存中。
drop_last (bool, optional) – 如果数据集大小不能被batch size整除,则设置为True后可删除最后一个不完整的batch。如果设为False并且数据集的大小不能被batch size整除,则最后一个batch将更小。(默认: False)
timeout:是用来设置数据读取的超时时间的,如果超过这个时间还没读取到数据的话就会报错。 所以,数值必须大于等于0。
weight.data
和bias.data
正如我们在构造nn.Linear
时指定输入和输出尺寸一样, 现在我们能直接访问参数以设定它们的初始值。 我们通过net[0]
选择网络中的第一个图层, 然后使用weight.data
和bias.data
方法访问参数。 我们还可以使用替换方法normal_
和fill_
来重写参数值。
MSELoss
计算均方误差的函数,也称为L2范数
在每个迭代周期里,我们将完整遍历一次数据集(train_data
), 不停地从中获取一个小批量的输入和相应的标签。 对于每一个小批量,我们会进行以下步骤:
net(X)
生成预测并计算损失l
(前向传播)。单层神经网络
函数损失为交叉熵损失
torch.flatten()
torch.flatten()
等于torch.flatten(x,0)默认将张量拉成一维的向量,也就是说从第一维开始平坦化,torch.flatten(x,1)代表从第二维开始平坦化。
torch.flatten(input, start_dim=0, end_dim=-1) → Tensor
input (Tensor) – 输入为Tensor
start_dim (int) – 展平的开始维度
end_dim (int) – 展平的最后维度
从start-end之间进行合并
回想一下,softmax函数 y j = e x p ( o j ) ∑ k e x p ( o k ) y_j = \frac{exp(o_j)}{\sum_kexp(o_k)} yj=∑kexp(ok)exp(oj), 其中 y j y_j yj是预测的概率分布。 o j o_j oj是未规范化的预测o的第j个元素。 如果中的一 o k o_k ok些数值非常大, 那么exp(ok)可能大于数据类型容许的最大数字,即上溢(overflow)。 这将使分母或分子变为inf
(无穷大), 最后得到的是0、inf
或nan
(不是数字)的 y j y_j yj。 在这些情况下,我们无法得到一个明确定义的交叉熵值。
在继续softmax计算之前,先从所有ok中减去 m a x ( o k ) max(o_k) max(ok)。 你可以看到每个ok按常数进行的移动不会改变softmax的返回值:
y j = e x p ( o j − m a x ( o k ) ) e x p ( m a x ( o k ) ) ∑ k e x p ( o k − m a x ( o k ) ) e x p ( m a x ( o k ) ) y_j = \frac{exp(o_j-max(o_k))exp(max(o_k))}{\sum_kexp(o_k-max(o_k))exp(max(o_k))} yj=∑kexp(ok−max(ok))exp(max(ok))exp(oj−max(ok))exp(max(ok))
用log计算损失 l o g ( y j ) = o j − m a x ( o k ) − log ( ∑ k e x p ( o k − m a x ( o k ) ) ) log(y_j)=o_j-max(o_k)-\log(\sum\limits_k exp(o_k-max(o_k))) log(yj)=oj−max(ok)−log(k∑exp(ok−max(ok)))