第二章 回归问题
即使是最简单的线性回归,由于观测误差的存在,也不可能找到一个满足所有样本的函数。因此,我们退而求其次,寻找到一个满足大部分样本点的直线。那么如何衡量这个呢,我们可以求出所有样本点真实值和预测值的误差,满足总误差最小的就是最好的。
连续值得预测问题被称为回归问题。离散值的预测问题被称为分类问题。
这一部分主要介绍了未来增加模型的泛化能力,通常的做法是增加数据集的规模和多样性。这个很好理解,主要体现在量和质上面,量多了自然能学到更多的东西,质是指学习的东西具有针对性(在训练集上学到的都可以在测试集上很好的体现,也就是训练集和测试集的分布是很接近的)。
MINST手写数据集的介绍。首先这个数据集发布于1998年。每张图像的固定大小,都是灰度图像。
独热编码是为了解决数字编码带来的数字之间存在关系。
定义one-hot编码
截止到这里,作者只介绍了一些简单的线性模型。由于线性模型对于复杂数据的拟合能力较差,因此可以选择加入非线性函数将模型转换为非线性模型。
常见的非线性激活函数是ReLU函数。
随着网络的加深,手工计算梯度变得十分麻烦。但是,深度学习的框架改变了这一问题。
手写数字识别实战。
首先通过Sequential搭建网络模型。
模型的训练过程。包括了优化器的设置、数据集的处理、输入数据、计算输出、计算损失函数、计算梯度(这里的梯度是自动计算的,loss.backward() 反向传播)
pytorch的基础是张量。不论是各种数据还是各种运算操作(OP)都是基于张量进行的。复杂神经网络的计算也都是各种张量相加、相乘的组合。
对于数值类型的张量可以保存为不同字节。字节越长,占用的空间就越多,精度就越高。
类型转换
pytorch通过给每一个张量添加requires_grad属性来判断该张量需不需要求导。由于求导需要占用内存,且比较消耗资源,因此requires_grad属性默认为False。
创建张量
这里讲了一种初始化方法。
维度变换
视图是张量属于同一块存储空间但是展现的方式不一样。
通常有两个函数 torch.reshape() torch.view() 可以改变视图
通常情况下不改变存储,一般都是属于浅拷贝。比如说,简单的赋值操作。深拷贝是指另外开辟一块新的存储空间。
增加维度 使用的是torch.unsqueze() 删除维度使用的是 torch.squeeze()
交换维度 通常使用torch.permute() 如果是两个维度的交换则可以使用torch.transpose()
tensor.repeat() 复制数据
tensor.expand()可以扩展维度(广播机制)
数据的复制和填充
数据的填充使用F.pad(tensor,[left,right]) 其中left代表左边需要填充的个数 right代表右边需要填充的个数
使用torch.max() 和torch.min() 实现数据限幅