打卡内容Coggle 30 Days of ML(21年11月)
任务1:PyTorch张量计算与Numpy的转换
- 1. 配置环境,参考本人另一篇文章https://blog.csdn.net/pandachu/article/details/121590603
- 2. 学习Pytorch的基础语法,实现如下代码
任务2:梯度计算和梯度下降过程
- 1.学习自动求梯度原理
- 2. 学习随机梯度下降原理(SGD)
随机梯度下降在计算下降最快的方向时时随机选一个数据进行计算,而不是扫描全部训练数据集,这样就加快了迭代速度。随机梯度下降并不是沿着J(θ)下降最快的方向收敛,而是震荡的方式趋向极小点
- 3. 使用numpy创建一个y=10*x+4+noise(0,1)的数据, 其中x是0到100的范围,以0.01进行等差数列, 定义w和b,并使用随机梯度下降,完成回归拟合.
- 3.1 首先定义初始数据x,y,noise,然后根据这些拟合出w,b
import torch
device = torch.device("cuda:0")
x = torch.linspace(0, 100, 10000, device=device, dtype=torch.float)
noise=torch.rand(10000, device=device, dtype=torch.float)
y = 10 * x + 4.0 + noise
- 3.2 初步使用tensor的前向反向传播解题
w = torch.randn((), device=device, dtype=torch.float) b = torch.randn((), device=device, dtype=torch.float) learning_rate = 1e-8 for t in range(50000): y_pred = w * x + b #前向传递,计算y的预测值 loss = (y_pred - y).pow(2).sum().item() #损失函数 grad_y_pred = 2.0 * (y_pred - y) #反向传递,计算w,b相对于损失的梯度 grad_b = grad_y_pred.sum() grad_w = (grad_y_pred * x).sum() b -= learning_rate * grad_b #使用梯度下降更新权重 w -= learning_rate * grad_w print(w.item(),b.item())
初始学习率设小一点,要不然loss出现nan, 该方法循环了5万次才得到较好的结果,
w,b 分别为10.004472732543945 4.203275680541992
- 3.3 使用Autograd求解
w = torch.randn((), device=device, dtype=torch.float, requires_grad=True)
b = torch.randn((), device=device, dtype=torch.float, requires_grad=True)
learning_rate = 1e-8
for k in range(50000):
y_pred = w * x + b
loss = (y_pred - y).pow(2).sum()
loss.backward()
with torch.no_grad():
w -= learning_rate * w.grad
b -= learning_rate * b.grad
w.grad = None
b.grad = None
print(w.item(),b.item())
w,b 分别为10.004472732543945 4.203275680541992
- 3.4 使用nn包
-
class Polynomial(torch.nn.Module): def __init__(self): super().__init__() self.w = torch.nn.Parameter(torch.randn(())) self.b = torch.nn.Parameter(torch.randn(())) def forward(self, x): return self.b + self.w * x model = Polynomial() loss_fn = torch.nn.MSELoss(reduction='sum') optimizer = torch.optim.SGD(model.parameters(), lr=1e-8) for t in range(50000): y_pred = model(x) loss = loss_fn(y_pred, y) optimizer.zero_grad() loss.backward() optimizer.step()
w,b的结果为 10.00623893737793 和4.085504531860352,可以看出使用SGD对结果有益处。
任务3:PyTorch全连接层原理和使用
- 1.学习全连接网络,参考文章
- 2.在pytorch中使用矩阵乘法实现全连接层
- 3.使用nn.Linear层
class MyModel(nn.Module):
def __init__(self):
super(MyModel,self).__init__()
self.lr = nn.Linear(1,1)
def forward(self, x):
return self.lr(x)
model = MyModel() #实例化模型
optimizer = torch.optim.SGD(model.parameters(),lr=1e-6) #实例化优化器
loss_fn = nn.MSELoss() #实例化损失函数
for i in range(5000):
optimizer.zero_grad() #梯度置为0
y_predict = model(x) #调用模型得到预测值
loss = loss_fn(y_predict,y) # 通过损失函数,计算得到损失
loss.backward() #反向传播,计算梯度
optimizer.step() #更新参数
任务4:PyTorch激活函数原理和使用
- 步骤1:学习激活函数的原理,https://zhuanlan.zhihu.com/p/88429934
- 步骤2:在pytorch中手动实现上述激活函数
任务5:PyTorch常见的损失函数和优化器使用
- 步骤1:学习损失函数的细节,https://www.cnblogs.com/wanghui-garcia/p/10862733.html
- 步骤2:学习优化器的使用,https://pytorch.org/docs/stable/optim.html
- 步骤3:设置不同的优化器和学习率,重复任务2的回归过程
学习率设置了0.1,0.01出现了nan,所以设置了更小的1e-6。
任务6:PyTorch卷积层原理和使用
- 步骤1:理解卷积层的原理和具体使用
CNN (Convolutional Neural Network ) 是一种前馈神经网络,由一个或多个卷积层和顶端的全连接层组成。同时包括了关联权重和池化层。
卷积层是卷积神经网络的核心。卷积运算是用卷积分别乘以输入向量中的每个元素,然后输出一个代表每个输入信息的张量。其中卷积核又叫权重过滤器(过滤器 filter)。
卷积核比较简单的过滤器有 Horizontalfilter,Verticalfilter, SobelFilter等,这些滤波器可以检测图像的水平边缘,垂直边缘,增强图像中心区域权重等。
检测边缘特征的滤波器类似于神经网络中的权重矩阵,需要通过梯度下降反复迭代求得。卷积神经网络的主要目的就是计算出这些filter 的数值。得到了这些 filter 后,卷积神经网络的浅层网络就实现了对图像所有边缘特征的检测。
- 步骤2:计算下如下卷积层的参数量
nn.Conv2d(in_channels=1, out_channels=32, kernel_size=5, stride=1, padding=2)
参数量是32*5*5=800
任务7:PyTorch池化层和归一化层
- 步骤1:使用pytroch代码实现2d pool中的mean-pooling、max-pooling
- https://pytorch.org/docs/stable/nn.html#pooling-layers
- https://blog.csdn.net/shanglianlm/article/details/85313924
池化层就是下采样,通过卷积层获取图像的特征后,理论上可以直接使用这些特征训练分类器。但是这样的计算量就很大,容易产出过拟合,就要进一步降低网络训练参数即模型的过拟合程度,就要进行池化处理。下图是三种常见池化方法
- 步骤2:学习归一化的原理
- batchNorm是在batch上,对小batchsize效果不好;
- layerNorm在通道方向上,主要对RNN作用明显;
- instanceNorm在图像像素上,用在风格化迁移;
- GroupNorm将channel分组再做归一化, 在batchsize<16的时候, 可以使用这种归一化。
任务8:使用PyTorch搭建VGG网络
- 步骤1:理解VGG网络的原理。
- 步骤2:使用pytorch搭建VGG网络模型。
- 步骤3:打印出VGG 11层模型 每层特征图的尺寸,以及参数量。
本文就不一层一层搭建网络了,直接调用torchvision.mocels.vgg11().
上图可以看出每层的结构与参数量。
任务9:使用PyTorch搭建ResNet网络
https://zhuanlan.zhihu.com/p/263526658
- 步骤1:理解ResNet网络的原理。
- 步骤2:使用pytorch搭建ResNet网络模型。
- 步骤3:打印出ResNet 18模型 每层特征图的尺寸,以及参数量。
任务10:使用PyTorch完成Fashion-MNIST分类
- 步骤1:搭建4层卷积 + 2层全连接的分类模型。
- 步骤2:在训练过程中记录下每个epoch的训练集精度和测试集精度。
任务11:使用PyTorch完成人脸关键点检测
- 步骤1:搭建4层卷积 + 2层的模型完成关键点回归。
- 步骤2:使用resnet18预训练模型完成关键点回归。
任务12:使用PyTorch搭建对抗生成网络
- 步骤1:学习对抗生成网络的原理
- 步骤2:学习DCGAN的代码实现
- 步骤3:使用任务11中的人脸数据(缩放至64*64),并使用DCGAN完成训练,生成人脸。