# 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)

### 大家都在看

• #### 1-Django2.2安装指南

django快速安装指南 作为一个Python Web框架，Django需要Python环境。下面是Django需要对应的python版本。Django版本python版本1.11…

Linux 2023年6月7日
0153
• #### SpringBoot 多环境配置文件切换

背景 很多时候，我们项目在开发环境和生成环境的环境配置是不一样的，例如，数据库配置，在开发的时候，我们一般用测试数据库，而在生产环境的时候，我们是用正式的数据，这时候，我们可以利用…

Linux 2023年6月14日
0172
• #### node-java的使用及源码分析

上篇文章简单提了下node调用java的方法但也只属于基本提了下怎么输出helloworld的层度，这次将提供一些案例和源码分析让我们更好地了解如何使用node-java库。 前置…

Linux 2023年6月14日
0124
• #### Web前端基础精品入门（HTML+CSS+JavaScript+JS）[爱前端]听课笔记（1）：网页中的logo的制作

前边课程没有仔细记录 css 学习笔记 index.html如下： 网页显示 但是我们不需要在网页中显示文字，用如下式样 文字不见，但是搜索引擎还能找到文字 目前高度没有居中，如果…

Linux 2023年6月14日
0132
• #### Springboot 的一些默认配置规则

本文样例说明仅适用 maven 环境和语法，但所述内容也适用 gradle 1. logback 日志默认为 slf4j + logback 框架，引入如下 jar 之后，就自动引…

Linux 2023年6月6日
0110
• #### Linux编译安装、压缩打包与定时任务服务

一、编译安装 即使用源代码编译安装的方式，编译打包软件。特点： 可以自定制软件； 可以按需构建软件； 编译安装案例 1、下载源代码包(这里以Nginx软件包源代码为例) wget …

Linux 2023年5月27日
0115
• #### SSH免密登录的配置

ssh登录 登录ssh一般情况有两种方法 密码登录 秘钥登录（免密） 大部分情况我们选择都是输入密码登录，平常使用暂时没有遇到什么问题。最近我编写了一些使用scp来传输文件的脚本，…

Linux 2023年6月6日
083
• #### 随笔记录

html结构、css表现、js行为vscode和sublime一样的在vscode中的插件：a.Auto Rename Tag 整体改变标签b.view-in-browser 预览…

Linux 2023年6月13日
0112
• #### LeetCode-47. 全排列 II

题目来源 题目详情 给定一个可包含重复数字的序列 nums ， 按任意顺序 返回所有不重复的全排列。 示例 1： 输入： nums = [1,1,2]输出：[[1,1,2],[1,…

Linux 2023年6月7日
0111
• #### Django orm的managed参数

Django orm的managed参数 如果一张表不是在django的models.py中创建表，而是该表由cmd或者Navicat或者其他方式创建的，或者该表是一个视图，那么也…

Linux 2023年6月14日
0118
• #### Jenkins，8080端口无法修改问题

今天安装了 Jenkins 。想把8080 端口修改为 6699 。 出现以下状况。 一：找到 jenkins.xml 文件。 vi /usr/lib/firewalld/serv…

Linux 2023年6月13日
0116
• #### docker-compose安装redis-sentinel集群（1主+2副+2哨兵）

前提：本试验环境已经提前安装了docker和docker-compose 说明：本次部署是单机伪集群，想要部署真正的集群，需要将秒个主件拆分到各个机器上去部署，只修改ip地址 1、…

Linux 2023年5月28日
0115
• #### 小白上手Linux系统安装Tomcat教程

1.准备阶段： 要有JDK环境，在安装好JDK后再配置tomcat，JDK安装详情在我博客中可以看到。 3.导入 进入到Xshell输入在自己的文件中(cd /home/lzh)好…

Linux 2023年6月13日
0132
• #### 文件相关命令

pwd指令 基本语法：pwd功能：显示当前工作的绝对目录 ls指令 基本语法：ls [选项][目录或者文件]常用选项 -a 显示所有文件及目录 (. 开头的隐藏文件也会列出) -l…

Linux 2023年6月6日
0112
• #### 【前端】【探究】HTML input类型为file时如何实现自定义文本以更好的美化

想到英语四级考了两次都没过，我觉得要多使用英文，所以本文使用英文书写。 本文讲述了遇到的问题，解决的思路，并讲述了解决方案，也许对你会有帮助。 Problem descriptio…

Linux 2023年6月14日
0166
• #### cdn缓存顺序优先级

posted @2022-09-26 17:28 爱折腾的大臭臭 阅读(10 ) 评论() 编辑 Original: https://www.cnblogs.com/linuxsh…

Linux 2023年6月6日
0136