【PyTorch】PyTorch神经网络实战入门
Google Colab
- 我们使用由谷歌提供的Colab免费服务,在谷歌的服务器上运行代码。登录谷歌账号之后,通过访问 https://colab.research.google.com 来激活谷歌Colab服务。
- 神经网络的输出由链接权重计算得出。输出依赖于权重,就像y依赖于x。
- 假设,一个简单网络的输出是z,正确的输出是t。那么,误差E即是 ( z − t ) (z-t) (z−t),或者 ( z − t ) 2 (z-t)^2 (z−t)2。误差E只是网络的一个节点,该网络以 ( z − t ) 2 (z-t)^2 (z−t)2,从z计算E的值。现在,有效的输出节点是E,而不是z。PyTorch 可以计算出新的E对于输入的梯度。
获取MNIST数据集
训练数据:https://pjreddie.com/media/files/mnist_train.csv
测试数据:https://pjreddie.com/media/files/mnist_test.csv
- 我们要确保上传的数据能够被Python代码访问。这需要我们加载Google Drive,使它作为一个文件夹出现。
# 加载数据文件
from google.colab import drive
drive.mount('./mount')
- 我们使用pandas库来加载和查看数据。
- 我们将一行像素值转换成实际图像来直观地查看一下。
简单的神经网络
- 构建神经网络类,以下为一个名为Classifier的类,它继承了nn.Module。PyTorch.nn模块会为我们设置分类器。
- 定义神经网络的模块,以及正向的信息传导
- 定义如何计算误差,以及用误差更新网络的可学习参数。
class Classifier(nn.Module):def __init__(self):# 初始化PyTorch父类super().__init__()# 定义神经网络层self.model = nn.Sequential(nn.Linear(784, 200),nn.Sigmoid(),nn.Linear(200, 10),nn.Sigmoid())# 创建损失函数self.loss_function = nn.MSELoss()# 创建优化器,使用简单的梯度下降self.optimiser = torch.optim.SGD(self.parameters(), lr=0.01)def forward(self, inputs):# 直接运行模型return self.model(inputs)
- PyTorch假定通过一个forward()方法向网络传递信息。这里,我们将输入传递给self.model(),它由nn.Sequential() 定义。模型的输出直接返回给 forward() 的主调函数。
- PyTorch允许我们按自己的想法构建网络的训练代码。train() 函数首先要做的是,使用forward()函数传递输入值给网络,并获得输出值。
def train(self, inputs, targets):# 计算网络的输出值outputs = self.forward(inputs)# 计算损失值loss = self.loss_function(outputs, targets)
- 使用损失来更新网络的链接权重。
- 首先,optimiser.zero_grad() 将计算图中的梯度全部归零。
- 其次,loss.backward() 从loss函数中计算网络中的梯度。
- 最后,optimiser.step() 使用这些梯度来更新网络的可学习参数。
# 梯度归零,反向传播,并更新权重self.optimiser.zero_grad()loss.backward()self.optimiser.step()
- 在每次训练网络之前,我们需要将梯度归零。否则,每次 loss.backward() 计算出来的梯度会累积。
- 我们可以把计算图的最终节点看作损失函数,该函数对每个进入损失的节点计算梯度,这些梯度是损失随着每个可学习参数的变化。
可视化训练
- 在神经网络类的构造函数中,创建一个初始值为0的计数器(counter)以及一个名为 progress 的空列表
# 记录训练进展的计数器和列表self.counter = 0self.progress = []
- 在train()函数中,我们可以每隔10个训练样本增加一次计数器的值,并将损失值添加进列表的末尾
# 增加一次计数器的值,每隔10个训练样本将损失值添加进列表的末尾self.counter += 1if (self.counter % 10 == 0):self.progress.append(loss.item())pass
- 要将损失绘制成图,可以在神经网络类中添加一个新函数 plot_progress()。
MNIST数据集类
- 尝试以PyTorch的方式加载和使用数据。
class MnistDataset(Dataset):def __init__(self, csv_file):self.data_df = pandas.read_csv(csv_file, header=None)passdef __len__(self):return len(self.data_df)def __getitem__(self, index):# 目标图像(标签)label = self.data_df.iloc[index, 0]target = torch.zeros((10)) # 创建一个维度为10的张量变量,神经网络的预期输出target[label] = 1.0 # 与标签相对应的张量是1,其他都是0# 图像数据,取值范围是0~255,标准化为0~1image_values = torch.FloatTensor(self.data_df.iloc[index, 1:].values) / 255.0# 返回标签、图像数据张量以及目标张量return label, image_values, targetpass
- 我们也可以为MnistDataset类添加一个制图方法,以方便查看我们正在处理的数据
def plot_image(self, index):arr = self.data_df.iloc[index,1:].values.reshape(28,28)plt.title("label = " + str(self.data_df.iloc[index,0]))plt.imshow(arr, interpolation='none', cmap='Blues')pass
训练分类器
%%time
# 创建神经网络
C = Classifier()# 在MNIST数据集训练神经网络
epochs = 3for i in range(epochs):print('training epoch', i+1, "of", epochs)for label, image_data_tensor, target_tensor in mnist_dataset:C.train(image_data_tensor, target_tensor)passpass
- 绘制收集到的损失值,以了解训练的进展。
查询神经网络
- 用一个新的Dataset对象来加载数据集
- 看看训练过的神经网络是如何判断这副图像的。使用 forward() 函数将图像传递并通过神经网络。
改良方法
激活函数
- S型逻辑函数具有一些缺点,最主要的一个缺点是,在输入值变大时,梯度会变得非常小甚至消失。这意味着,在训练神经网络时,如果发生这种饱和,我们无法通过梯度来更新链接权重。
- 带泄漏线性整流函数(Leaky ReLU),在函数的左半边增加一个小梯度。
# 定义神经网络层self.model = nn.Sequential(nn.Linear(784, 200),# nn.Sigmoid(),nn.LeakyReLU(0.02), # 0.02是函数左半边的梯度nn.Linear(200, 10),# nn.Sigmoid()nn.LeakyReLU(0.02))
- 随机梯度下降法的缺点之一是,它会陷入损失函数的局部最小值(local minima)。另一个缺点是,它对所有可学习的参数都使用单一的学习率。最常见的替代方案是Adam,它利用动量的概念,减少陷入局部最小值的可能性,同时,它对每个可学习的参数使用单独的学习率,这些学习率随着每个参数在训练期间的变化而改变。
【PyTorch】PyTorch神经网络实战入门相关推荐
- pytorch深度学习和入门实战(四)神经网络的构建和训练
目录 1.前言 2.神经网络概述 2.1 核心组件包括: 2.2 核心过程 3.构建神经网络模型 3.1构建网络层(Layer ➨ Model) 3.2 torch.nn.Sequential的3大使 ...
- Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程
基于pytorch的深度学习花朵种类识别项目完整教程(内涵完整文件和代码) 相关链接:: 超详细--CNN卷积神经网络教程(零基础到实战) 大白话pytorch基本知识点及语法+项目实战 文章目录 基 ...
- 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类
Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...
- 【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战
1 深层卷积神经网络概述 1.1 深层卷积神经网络模型结构图 1.1.1 深层卷积神经网络的正向结构构成剖析 输入层,将每个像素作为一个特征节点输入网络. 卷积层:由多个滤波器组合而成. 池化层:将卷 ...
- 深度学习二(Pytorch物体检测实战)
深度学习二(Pytorch物体检测实战) 文章目录 深度学习二(Pytorch物体检测实战) 1.PyTorch基础 1.1.基本数据结构:Tensor 1.1.1.Tensor数据类型 1.1.2. ...
- 150页书籍《PyTorch 深度学习快速入门指南》附PDF电子版
为什么说是极简教程,首先本书只涵盖了150页.内容比较精简,特别适合作为 PyTorch 深度学习的入门书籍.为什么这么说呢?因为很多时候,一份厚重的书籍往往会削弱我们学习的积极性,在学习一门新的语言 ...
- 【完结】12大深度学习开源框架(caffe,tf,pytorch,mxnet等)快速入门项目
这是一篇总结文,给大家来捋清楚12大深度学习开源框架的快速入门,这是有三AI的GitHub项目,欢迎大家star/fork. https://github.com/longpeng2008/yousa ...
- 实战例子_Pytorch官方力荐新书《Pytorch深度学习实战指南》pdf及代码分享
PyTorch是目前非常流行的机器学习.深度学习算法运算框架.它可以充分利用GPU进行加速,可以快速的处理复杂的深度学习模型,并且具有很好的扩展性,可以轻松扩展到分布式系统.PyTorch与Pytho ...
- 深度学习三(PyTorch物体检测实战)
深度学习三(PyTorch物体检测实战) 文章目录 深度学习三(PyTorch物体检测实战) 1.网络骨架:Backbone 1.1.神经网络基本组成 1.1.1.卷积层 1.1.2.激活函数层 1. ...
最新文章
- 高效查看MySQL帮助文档的方法
- Max retries exceeded with url
- Exchange系列—群集连续复制配置
- RecyclerView实现滑动删除和拖拽功能
- 那个准点下班的人,比我先升职了...
- 命令netstat和DHCP
- ExtJS4.2学习(13)基于表格的扩展插件---rowEditing
- 一、struts入门
- 傅里叶变换和自然对数e原来是这么回事
- mysql 新建用户并赋予远程访问权限
- 计算机在线考试报名系统软件,全国计算机软考报名官网
- MAC下切换多个IP的Shell脚本
- python 管理windows客户端_Python管理Windows进程
- gulp_for_qa
- 戴尔服务器安装linux不能识别硬盘,戴尔服务器重装系统找不到硬盘怎么办.
- 在pc电脑上使用地图(百度地图、高德地图等),地图软件是怎么获取pc电脑的所在位置的?
- java指定日期计算一年内第几天和给出一年内第几天算出指定日期
- 怎么远程控制linux,Linux远程控制
- 云服务 IaaS、PaaS、SaaS
- JDK1.8新特性:lambda表达式