训练及优化神经网络基本流程之第0到6步

在之前的笔记中,我记录过《神经网络的代价函数及反向传播算法》,以及使用BP算法(反向传播算法)的一点细节。

这篇笔记想简短地总结记录一下训练并优化神经网络的几个步骤:

第零步:之所以写了个第零步,是想记录一下如何搭建神经网络,毕竟要先有网络才能谈后续的训练和优化。关于构建问题之前也有过记录:《神经网络的模型构建》。输入层的单元个数取决于特征个数,也就是 x^{(i)} ;输出层的单元个数取决于训练集中结果的类别数量。具体需要我们决策的是中间隐藏层的数量以及每层的单元个数。一般来说,默认的隐藏层只有一层,若需要使用多个,则要保证每层的单元个数是相等的。通常隐藏层数越多,结果也越精确,但意味着计算量也随之增大,两者需要平衡。

第一步:进行参数的随机初始化。通常我们需要把参数初始化为趋近于0的极小的值。作逻辑回归时,我们通常将参数初始化为0,但对于神经网络这样是不可行的,若都初始化为0,那么第二层每个单元节点的值都会是相同的,若都初始化为同一个非零的数,结果也是一样的。所以每个参数要在0附近的正负值范围内随机选取。

第二步:执行前向传播。从左向右进行计算,对于输入的任意 x^{(i)},计算出 h_{\Theta}(x^{(i)}) ,结果的形式为向量。

第三步:编写计算代价函数 J(\Theta) 的代码。

第四步:执行反向传播算法,计算所有的偏导数 \frac{\partial}{\partial \Theta_{jk}^{(l)}}J(\Theta) ,即 J(\Theta) 关于 \theta 的偏导数。

第五步:使用梯度检验来将反向传播算法得到的偏导数值,与数值方法得到的估计值进行比较,以确保两种方法得到的值是接近的。进行这步的原因是,在实际运行过程中,我们的代码可能存在很多 bug,J(\Theta) 的值虽然可能在减小,但最后得到的值可能存在极大的误差,采用梯度检查的方法可以减小这种错误的概率。但要注意之后把梯度检查的代码注释掉,因为非常花时间。

第六步:使用梯度下降法或更高级的算法(如BFGS算法、共轭梯度法),与反向传播算法相结合,来将 J(\Theta) 的值最小化。但要注意的是,由于神经网络并不是一个线性的模型,其代价函数 J(\Theta) 是个非凹函数,所以我们使用梯度下降等方法得到的结果只是一个局部最优解,并不保证就是全局最优解。

欢迎关注我的知乎专栏【数据池塘】,专注于分享机器学习、数据挖掘相关内容:https://zhuanlan.zhihu.com/datapool

 

⬇️ 扫描下方二维码关注公众号【数据池塘】 ⬇️

回复【算法】,获取最全面的机器学习算法网络图:

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先需要导入 PyTorch 库: ```python import torch import torch.nn as nn import torch.optim as optim ``` 接下来定义一个全连接神经网络模型(也称为多层感知机,MLP),该模型由多个线性层和激活函数组成。下面是一个简单的例子,包含两个隐藏层和一个输出层: ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(784, 128) self.fc2 = nn.Linear(128, 64) self.fc3 = nn.Linear(64, 10) self.relu = nn.ReLU() def forward(self, x): x = x.view(-1, 784) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x ``` 其中,`nn.Linear` 表示线性层,第一个参数是输入特征数,第二个参数是输出特征数。`nn.ReLU` 表示 ReLU 激活函数。 下一是定义模型的损失函数和优化器: ```python net = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) ``` 其中,`nn.CrossEntropyLoss` 表示交叉熵损失函数,`optim.SGD` 表示随机梯度下降优化器,`lr` 表示学习率,`momentum` 表示动量。 接下来是模型的训练过程: ```python for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 1000 == 999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 1000)) running_loss = 0.0 ``` 其中,`trainloader` 是训练数据的数据加载器,`enumerate` 函数用于遍历数据集,`inputs` 和 `labels` 分别表示输入和标签。 在每个 epoch 中,模型会遍历整个训练集,计算损失并更新参数。每隔一定的数打印一次损失。 最后,我们可以使用测试集对模型进行评估: ```python correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) ``` 其中,`testloader` 是测试数据的数据加载器,`torch.no_grad()` 表示不需要计算梯度,`torch.max` 表示返回最大值和索引。 这就是使用 PyTorch 训练全连接神经网络基本流程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风控大鱼

如果帮到了您,请我喝杯咖啡吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值