线性回归的实现学习

线性回归的实现学习

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.databias.data

正如我们在构造nn.Linear时指定输入和输出尺寸一样, 现在我们能直接访问参数以设定它们的初始值。 我们通过net[0]选择网络中的第一个图层, 然后使用weight.databias.data方法访问参数。 我们还可以使用替换方法normal_fill_来重写参数值。

MSELoss

计算均方误差的函数,也称为L2范数

在每个迭代周期里,我们将完整遍历一次数据集(train_data), 不停地从中获取一个小批量的输入和相应的标签。 对于每一个小批量,我们会进行以下步骤:

  • 通过调用net(X)生成预测并计算损失l(前向传播)。
  • 通过进行反向传播来计算梯度。
  • 通过调用优化器来更新模型参数。

softmax

单层神经网络

函数损失为交叉熵损失

torch.flatten()

torch.flatten()等于torch.flatten(x,0)默认将张量拉成一维的向量,也就是说从第一维开始平坦化,torch.flatten(x,1)代表从第二维开始平坦化。

torch.flatten(input, start_dim=0, end_dim=-1) → Tensor

Parameters:
  • 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、infnan(不是数字)的 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(okmax(ok))exp(max(ok))exp(ojmax(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)=ojmax(ok)log(kexp(okmax(ok)))

你可能感兴趣的:(神经网络,pytorch,深度学习)