梯度下降与反向传播
1 . 反向传播
a. 计算图
i: 把数据和操作通过图来表示
2. pytorch完成线性回归
a. tensor(data,requird_grad=Ture)
i: 该tensor后续会被计算梯度
ii:tensor所以的操作都会被记录在grad_fn
b. with torch.no_grad():
I:其中的操作不会被跟踪
c. 反向传播: output.backward()
d. 获取梯度:x.grad, 累加梯度
I: 所以: 每次反向传播之前需要先把梯度置为0之后
Pytorch--常用API_小人物CM的博客-CSDN博客
model = Lr() #1.实例模型
criterion = nn.MSELoss() #2. 实例化损失函数
optimizer = optim.SGD(model.parameters(),lr=1e-3) #3.实例化优化器类
for i in range(100):
y_predict = model(x_true) # 4. 向前计算预测值
loss = criterion(y_true,y_predict) #5. 调用损失函数传入真实值和预测值,得到损失结果
optimizer.zerograd() #6. 当前循环参数梯度置为0
loss.backward() #7. 计算梯度
optimizer.step() #8. 更新参数的值
bp神经网络: 反向传播
卷积 :滑动窗口(算法) # 特性:1.局部感知机制 2. 权值共享
引用激活函数的原因:在计算过程中,它是一个线性计算过程,为引入非线性因素,使其具备解决非线性问题的能力。
缺点:
1. Sigmoid激活函数:
饱和时梯度值非常小,故网络层数较深时容易出现梯度消失。
2. Relu激活函数:
当反向传播过程中有一个非常大的梯度经过时,反向传播更新后可能导致权重分布中心小于零,导致该处的倒数始终为0,反向传播无法更新权重,即进入失活状态。
池化层的目的:对特征图进行稀疏处理,减少数据运算量。
#特点:1. 没有训练参数
2.只改变特征矩阵的W和H,不改变channel
3.一般poolsize和 stride相同
注:1. 在计算多类损失过程中,在最后一层激活函数统一用 softmax 激活函数
2. 使用几个卷积核就会生成深度为多少维的特征矩阵
3. stride # 布局
经卷积后的矩阵尺寸大小计算公式为:
1.输出图片的大小
2.Filter大小
3.步长S
4.P:padding的像素数
self.conv1=nn. Conv2d(a,b,c) #a=输入特征层的深度,b=卷积核数,c=卷积核尺度
self.pool1= nn.MaxPool2d(a,b) #a=池化核大小, b=步距
self.fc1= nn. Linear(a,b) #a=第一层节点, b= 第二层节点
注:一般特征图的长宽减半后,通道数要加倍
Pytorch Tensor 的通道排序 : [ batch, channel , height, width]
下载训练集:
trainset = torchvision.datasets.CIFAR10(root=', train=Ture, download=True, transform=transform)
标准化是:
反标准化是:
计算一个batch , 就需要调用一次optimizer.zero_grad()
#如果不清除历史梯度,就会对计算的历史梯度进行累加(通过这个特性你能够变相实现一个很大batch数值的训练)