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模块会为我们设置分类器。
  1. 定义神经网络的模块,以及正向的信息传导
  2. 定义如何计算误差,以及用误差更新网络的可学习参数。
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)
  • 使用损失来更新网络的链接权重。
  1. 首先,optimiser.zero_grad() 将计算图中的梯度全部归零。
  2. 其次,loss.backward() 从loss函数中计算网络中的梯度。
  3. 最后,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神经网络实战入门相关推荐

  1. pytorch深度学习和入门实战(四)神经网络的构建和训练

    目录 1.前言 2.神经网络概述 2.1 核心组件包括: 2.2 核心过程 3.构建神经网络模型 3.1构建网络层(Layer ➨ Model) 3.2 torch.nn.Sequential的3大使 ...

  2. Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程(内涵完整文件和代码) 相关链接:: 超详细--CNN卷积神经网络教程(零基础到实战) 大白话pytorch基本知识点及语法+项目实战 文章目录 基 ...

  3. 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

    Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...

  4. 【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战

    1 深层卷积神经网络概述 1.1 深层卷积神经网络模型结构图 1.1.1 深层卷积神经网络的正向结构构成剖析 输入层,将每个像素作为一个特征节点输入网络. 卷积层:由多个滤波器组合而成. 池化层:将卷 ...

  5. 深度学习二(Pytorch物体检测实战)

    深度学习二(Pytorch物体检测实战) 文章目录 深度学习二(Pytorch物体检测实战) 1.PyTorch基础 1.1.基本数据结构:Tensor 1.1.1.Tensor数据类型 1.1.2. ...

  6. 150页书籍《PyTorch 深度学习快速入门指南》附PDF电子版

    为什么说是极简教程,首先本书只涵盖了150页.内容比较精简,特别适合作为 PyTorch 深度学习的入门书籍.为什么这么说呢?因为很多时候,一份厚重的书籍往往会削弱我们学习的积极性,在学习一门新的语言 ...

  7. 【完结】12大深度学习开源框架(caffe,tf,pytorch,mxnet等)快速入门项目

    这是一篇总结文,给大家来捋清楚12大深度学习开源框架的快速入门,这是有三AI的GitHub项目,欢迎大家star/fork. https://github.com/longpeng2008/yousa ...

  8. 实战例子_Pytorch官方力荐新书《Pytorch深度学习实战指南》pdf及代码分享

    PyTorch是目前非常流行的机器学习.深度学习算法运算框架.它可以充分利用GPU进行加速,可以快速的处理复杂的深度学习模型,并且具有很好的扩展性,可以轻松扩展到分布式系统.PyTorch与Pytho ...

  9. 深度学习三(PyTorch物体检测实战)

    深度学习三(PyTorch物体检测实战) 文章目录 深度学习三(PyTorch物体检测实战) 1.网络骨架:Backbone 1.1.神经网络基本组成 1.1.1.卷积层 1.1.2.激活函数层 1. ...

最新文章

  1. 高效查看MySQL帮助文档的方法
  2. Max retries exceeded with url
  3. Exchange系列—群集连续复制配置
  4. RecyclerView实现滑动删除和拖拽功能
  5. 那个准点下班的人,比我先升职了...
  6. 命令netstat和DHCP
  7. ExtJS4.2学习(13)基于表格的扩展插件---rowEditing
  8. 一、struts入门
  9. 傅里叶变换和自然对数e原来是这么回事
  10. mysql 新建用户并赋予远程访问权限
  11. 计算机在线考试报名系统软件,全国计算机软考报名官网
  12. MAC下切换多个IP的Shell脚本
  13. python 管理windows客户端_Python管理Windows进程
  14. gulp_for_qa
  15. 戴尔服务器安装linux不能识别硬盘,戴尔服务器重装系统找不到硬盘怎么办.
  16. 在pc电脑上使用地图(百度地图、高德地图等),地图软件是怎么获取pc电脑的所在位置的?
  17. java指定日期计算一年内第几天和给出一年内第几天算出指定日期
  18. 怎么远程控制linux,Linux远程控制
  19. 云服务 IaaS、PaaS、SaaS
  20. JDK1.8新特性:lambda表达式

热门文章

  1. PHP调用API接口
  2. android sdl,能通吃所有安卓手机的SDL究竟是何神通?
  3. 2013年09月27日
  4. 前端学习笔记 - HTML+CSS
  5. 在Linux下安装配置bochs,并成功跑一个简单的boot引导(超详细)
  6. iptable中文学习文档
  7. jquery循环获取div之间的内容
  8. jquery 实现背景图片循环切换,显示隐藏div
  9. Service Mesh初识
  10. 浏览器代理服务器出现问题