此前在疫情期间学习了AI的经典算法理论,但一直没有机会实战敲敲代码,总感觉有遗憾,现在抓紧时间实战一下!下面的笔记其实就是的pytorch官方学习代码加上个人的理解,代码已经试运行过了,边做边学吧。
1、模型是如何学习的
-
模型学习的两种方式:正反馈和负反馈机制
-
forwardpropagation
:告诉模型什么知识,它就输出什么,类似模仿,中间包括提取特征(抓取精华,抽选。
👇下面是定义了神经网络和前向传播的pytorch代码
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = torch.flatten(x, 1) # flatten all dimensions except batch
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
-
backpropagation
: 负反馈学习机制,从错误中吸收经验,失败乃成功之母!(本质是通过损失函数调整模型的参数) -
如何判断模型真正学到了知识
-
loss function
: 交叉熵损失(Cross-Entropy loss)是一种常用的损失函数,特别适用于分类问题。它用于衡量模型的预测结果与真实标签之间的差异,跟人类的考试差不多,用于查看模型的学习程度。当然了损失函数也只有Cross-Entropy loss这一种
-
👇: pytorch实现模型训练的代码,注意的点:每一次反向学习的计算前都需要对梯度进行清零
,否则会引起梯度爆炸和梯度消失的问题,也即每次学习到更新了的状态会被推翻,模型状态变得跟薛定谔的猫一样飘忽不定,也即训练会没有效果。
for epoch in range(2): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data
# zero the parameter gradients
optimizer.zero_grad() #清除前一次训练的梯度
# forward + backward + optimize
outputs = net(inputs) #这里就是正反馈学习
loss = criterion(outputs, labels)
loss.backward() #负反馈
optimizer.step()
# print statistics
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0
print('Finished Training')
2、模型的训练过程(此处包含我个人不成熟的案例解说)
模型训练步骤通常包含下面的模块
- 读取数据集(分批读): 此处引入batch和epoch的概念,相当于一本书一共
200页-->总数据集
,每天只能读10页-->batch_size
,分20天-->迭代iterations
读完,读完一次全书-->1次epoch
。温故而知新,一本书可以读多次,就有多轮的epoch了
- 读取数据集(分批读): 此处引入batch和epoch的概念,相当于一本书一共
- 模型预测(正反馈):看小说的开头,已经可以根据有限的信息推测后续的发展了,这里可以推断出有
n种结局
😎
- 模型预测(正反馈):看小说的开头,已经可以根据有限的信息推测后续的发展了,这里可以推断出有
- 计算损失:😥
哪一种结局比较接近真实结局呢?
,这时候就是要跟真的结局相比较了。假设真正的结局是喜剧,那么猜到了是悲剧就扣50分😭,如果结局是be种带点he比较接近真实的结局,就扣20分☺。
- 计算损失:😥
-
4、根据损失值进行负反馈学习调整模型的权重:对于模型而言,结局依然是未知的,随着线索的获取,就可以更新自己的预测并根据扣分的多少去衡量怎样的结局是真实结局🧐,这就是反馈的过程。
上述的解说也不一定对啦,也可以参考猜数字游戏。
总结
本篇笔记记录一个神经网络的基本训练路线,代码中包含了网络的构建,学习(训练)的过程。
ps: 上述的个人理解不一定正确,有误请在评论区指出/(ㄒoㄒ)/~~
参考
浅显易懂的池化层解释
网友评论