# PYTORCH: 60分钟 | 神经网络

convnet

• 定义神经网络，并包括一些可学习的参数（或权重）
• 通过输入数据集迭代
• 通过网络处理输入
• 计算损失（输出和真值的差距）
• 将梯度反向传播至神经网络的参数
• 更新神经网络权重，通常使用简单的更新规则： weight = weight - learning_rate * gradient

## 定义网络

import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):

def __init__(self):
super(Net, self).__init__()
# 1&#x4E2A;&#x8F93;&#x5165;&#x56FE;&#x7247;&#x901A;&#x9053;&#xFF0C;6&#x4E2A;&#x8F93;&#x51FA;&#x901A;&#x9053;&#xFF0C;5x5&#x5E73;&#x65B9;&#x5377;&#x79EF;&#x6838;
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
# &#x4E00;&#x4E2A;&#x4EFF;&#x5C04;&#x53D8;&#x6362;&#x64CD;&#x4F5C;&#xFF1A;y = Wx + b
self.fc1 = nn.Linear(16 * 5 * 5, 120) # 5*5&#x662F;&#x7279;&#x5F81;&#x56FE;&#x7EF4;&#x5EA6;
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
# &#x6700;&#x5927;&#x6C60;&#x5316;&#xFF1A;&#xFF08;2&#xFF0C;2&#xFF09;&#x7A97;&#x53E3;
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# &#x5982;&#x679C;&#x7A97;&#x53E3;&#x5927;&#x5C0F;&#x662F;&#x6B63;&#x65B9;&#x5F62;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5355;&#x4E2A;&#x6570;&#x5B57;
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = torch.flatten(x, 1) # &#x5C06;&#x9664;&#x4E86;batch&#x7EF4;&#x5EA6;&#x7684;&#x6240;&#x6709;&#x7EF4;&#x5EA6;&#x5C55;&#x5E73;
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
print(net)


Net(
(conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
(fc1): Linear(in_features=400, out_features=120, bias=True)
(fc2): Linear(in_features=120, out_features=84, bias=True)
(fc3): Linear(in_features=84, out_features=10, bias=True)
)


net.parameters() 返回模型的可学习参数

params = list(net.parameters())
print(len(params))
print(param[0].size()) # conv1&#x7684;&#x6743;&#x91CD;&#x53C2;&#x6570;


10
torch.size([6, 1, 5, 5])


input = torch.randn(1, 1, 32, 32)
out = net(input)
print(out)


tensor([[-0.1380, -0.0528,  0.0736,  0.1018,  0.0066, -0.1454,  0.0366, -0.0692,


net.zero_grad()
out.backward(torch.randn(1, 10))


Recap：

• torch.Tensor – 一个 multi-dimensional array，支持autograd操作，如 backward()。还持有关于tensor的梯度。
• nn.Module – 神经网络模型。封装参数的一个便捷的途径，并且可将它们移动到GPU，输出、加载等。
• nn.Parameter – 当tensor作为属性赋给 Module时，自动注册为参数。
• autograd.Function – autograd的前向和后向定义的具体实现。每一个 Tensor 操作创建最少一个 Function 节点，并连接到创建 Tensor 和对其历史进行编码的函数。

• Defining a neural network
• Processing inputs and calling backward

• 计算损失
• 更新网络权重

## 损失函数

output = net(input)
target = torch.randn(10) # &#x4E00;&#x4E2A;&#x5047;&#x7684;target
target = target.view(1, -1) # &#x4F7F;&#x5176;&#x4E0E;output&#x4FDD;&#x6301;&#x5F62;&#x72B6;&#x4E00;&#x81F4;
criterion = nn.MSELoss()

loss = criterion(output, target)
print(loss)


tensor(1.3339, grad_fn=<mselossbackward0>)
</mselossbackward0>


input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d
-> flatten -> linear -> relu -> linear - relu -> linear
-> MSELoss
-> loss


print(loss.grad_fn) # MSELoss


<mselossbackward0 object at 0x7efad9c382b0>


## Backprop

net.zero_grad() # &#x5C06;&#x6240;&#x6709;&#x53C2;&#x6570;&#x7684;&#x68AF;&#x5EA6;&#x7F13;&#x5B58;&#x8BBE;&#x7F6E;&#x4E3A;0

loss.backward()



conv1.bias.grad before backward
tensor([0., 0., 0., 0., 0., 0.])
tensor([ 0.0061, -0.0024, -0.0051, -0.0073,  0.0014,  0.0074])


• 更新网络的权重

## 更新权重

weight = weight - learning * gradient


learning_rate = 0.1
for f in net.parameters():


import torch.optim as optim

optimizer = optim.SGD(net.parameters(), lr=0.01)

output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step() # Does the update


Original: https://www.cnblogs.com/DeepRS/p/15720200.html
Author: Deep_RS
Title: PYTORCH: 60分钟 | 神经网络

(0)

### 大家都在看

• #### 【Linux】【虚拟机】 IP地址的动态与静态设置

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Linux 2022年11月8日
0127
• #### 禅道迁移(windows_to_linux)

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Linux 2022年8月13日
0281
• #### ElasticSearch7.2安装

下载JDK压缩包，通过SFTP客户端（WinSCP）上传到CentOS7相应的目录下。然后解压JDK，解压命令为: tar -zxvf jdk-12.0.2_linux-x64_b…

Linux 2023年6月7日
033
• #### 如何配置VLAN

一、vlan的概念与作用 首先，在学习如何配置vlan时我们先要了解一下为什么要配置vlan？vlan在平常的工作中有什么作用？ vlan：虚拟的划分网段 即虚拟网络，在平常的工作…

Linux 2023年6月6日
020
• #### 项目开发流程与开发模式

企业项目开发流程 商城 1.1 B2C 直销商城 商家与会员直接交易 ( Business To Customer ) 1.2 B2B 批发商城 商家与商家直接交易 1.3 B2B…

Linux 2023年6月14日
029
• #### 远程通信的几种选择（RPC，Webservice，RMI，JMS的区别）

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Linux 2022年8月26日
0123
• #### LRU原理和Redis实现——一个今日头条的面试题(转载)

很久前参加过今日头条的面试，遇到一个题，目前半部分是如何实现 LRU，后半部分是 Redis 中如何实现 LRU。 我的第一反应是操作系统课程里学过，应该是内存不够的场景下，淘汰旧…

Linux 2023年5月28日
019
• #### redis导致的错误错误

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Linux 2022年9月14日
0128
• #### 搭建redis集群

这里总结性给出搭建步骤： 1、 至少6个节点，三主三从 2、 编译redis源码 3、放置集群的配置文件redis.conf 创建工作目录： 每个文件夹下新建redis.conf …

Linux 2023年5月28日
018
• #### kubeadm 加入新master 报错

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Linux 2022年11月8日
0125
• #### CentOS 文本编辑器

Linux 终端的文本编辑器中，较著名的有：Nano、Vim、Emacs。其它文本编辑器还有 Gedit、Sublime，Atom 等等。 1.1、基础命令 nano：打开 nan…

Linux 2023年6月8日
025
• #### selenium-自动化测试51job网站（MacOS + Safari）2020年10月6日

登录 51job ，http://www.51job.com 输入搜索关键词 “python”， 地区选择 “杭州”（注意，如果所在…

Linux 2023年6月14日
021
• #### Linux安装管理

Linux系列 包管理工具 单个软件包 管理工具 RedHat系列 Redhat Centos Fedora yum rpm .rpm Debian系列 Ubuntu apt-ge…

Linux 2023年6月8日
019
• #### CMU15-445 数据库导论 Storage02 其他存储方式

CMU15-445 数据库导论 Storage02 其他存储方式 1. 参考资料： [1] CMU15-445:Database Systems [Andy Pavlo] http…

Linux 2023年6月6日
031
• #### 三少玩Linux之ArchLinux 与win7 共存简单安装过程记录

注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

Linux 2022年11月7日
0138
• #### 【Leetcode】64. 最小路径和

给定一个包含非负整数的 m&#xA0;x&#xA0;n网格 grid，请找出一条从左上角到右下角的路径，使得路径上的数字总和为最小。 说明：每次只能向下或者向右移动…

Linux 2023年6月6日
021