文章目录

  • 1. nn模块
  • 2. torch.optim 优化器
  • 3. 自定义nn模块
  • 4. 权重共享

参考 http://pytorch123.com/

1. nn模块

import torch
N, D_in, Hidden_size, D_out = 64, 1000, 100, 10
  • torch.nn.Sequential 建立模型,跟 keras 很像
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)model = torch.nn.Sequential(torch.nn.Linear(D_in, Hidden_size),torch.nn.ReLU(),torch.nn.Linear(Hidden_size, D_out)
)# 损失函数
loss_fn = torch.nn.MSELoss(reduction='sum')
learning_rate = 1e-4
loss_list = []for t in range(500):y_pred = model(x) # 前向传播loss = loss_fn(y_pred, y) # 损失loss_list.append(loss.item())print(t, loss.item())model.zero_grad() # 清零梯度loss.backward() # 反向传播,计算梯度with torch.no_grad(): # 更新参数,不计入网络图的操作当中for param in model.parameters():param -= learning_rate*param.grad # 更新参数
# 绘制损失
import pandas as pd
loss_curve = pd.DataFrame(loss_list, columns=['loss'])
loss_curve.plot()

2. torch.optim 优化器

  • torch.optim.Adam 使用优化器
  • optimizer.zero_grad() # 清零梯度
  • optimizer.step() # 更新参数
learning_rate = 1e-4optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)loss_list = []
for t in range(500):y_pred = model(x) # 前向传播loss = loss_fn(y_pred, y) # 损失loss_list.append(loss.item())print(t, loss.item())optimizer.zero_grad() # 清零梯度loss.backward() # 反向传播,计算梯度optimizer.step() # 更新参数

3. 自定义nn模块

  • 继承 nn.module,并定义 forward 前向传播函数
import torch
class myModel(torch.nn.Module):def __init__(self, D_in, Hidden_size, D_out):super(myModel, self).__init__()self.fc1 = torch.nn.Linear(D_in, Hidden_size)self.fc2 = torch.nn.Linear(Hidden_size, D_out)def forward(self, x):x = self.fc1(x).clamp(min=0) # clamp 修剪数据在 min - max 之间,relu的作用x = self.fc2(x)return x
N, D_in, Hidden_size, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)model = myModel(D_in, Hidden_size, D_out) # 自定义模型loss_fn = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)loss_val = []for t in range(500):y_pred = model(x)loss = loss_fn(y_pred, y)loss_val.append(loss.item())optimizer.zero_grad()loss.backward()optimizer.step()import pandas as pd
loss_val = pd.DataFrame(loss_val, columns=['loss'])
loss_val.plot()

4. 权重共享

  • 建立一个有3种FC层的玩具模型,中间 shareFC层会被 for 循环重复 0-3 次(随机),这几层(次数随机)的参数是共享的
import random
import torchclass shareParamsModel(torch.nn.Module):def __init__(self, D_in, Hidden_size, D_out):super(shareParamsModel, self).__init__()self.inputFC = torch.nn.Linear(D_in, Hidden_size)self.shareFC = torch.nn.Linear(Hidden_size, Hidden_size)self.outputFC = torch.nn.Linear(Hidden_size, D_out)self.sharelayers = 0 # 记录随机出了多少层def forward(self, x):x = self.inputFC(x).clamp(min=0)self.sharelayers = 0for _ in range(random.randint(0, 3)):x = self.shareFC(x).clamp(min=0)self.sharelayers += 1x = self.outputFC(x)return x
N, D_in, Hidden_size, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)model = shareParamsModel(D_in, Hidden_size, D_out)loss_fn = torch.nn.MSELoss(reduction='sum')optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)loss_val = []for t in range(500):y_pred = model(x)print('share layers: ', model.sharelayers)loss = loss_fn(y_pred, y)loss_val.append(loss.item())optimizer.zero_grad()loss.backward()optimizer.step()for p in model.parameters():print(p.size())import pandas as pd
loss_val = pd.DataFrame(loss_val, columns=['loss'])
loss_val.plot()

输出:

share layers:  1
share layers:  0
share layers:  2
share layers:  1
share layers:  2
share layers:  1
share layers:  0
share layers:  1
share layers:  0
share layers:  0
share layers:  3
share layers:  3
。。。省略

参数数量,多次运行,均为以下结果

torch.Size([100, 1000])
torch.Size([100])
torch.Size([100, 100])
torch.Size([100])
torch.Size([10, 100])
torch.Size([10])

Pytorch 神经网络nn模块相关推荐

  1. Pytorch基础(五)nn模块及optimizer

    目录 PyTorch之nn模块 PyTorch之optim模块 自定义nn模块 控制流和权重共享 PyTorch之nn模块 计算图和autograd是十分强大的工具,可以定义复杂的操作并自动求导:然而 ...

  2. Pytorch:核心模块,torch.nn与网络组成单元

    Pytorch: torch.nn 模块与网络组成单元 Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, Scho ...

  3. Pytorch的nn.Conv2d()详解

    Pytorch的nn.Conv2d()详解 nn.Conv2d()的使用.形参与隐藏的权重参数 in_channels out_channels kernel_size stride = 1 padd ...

  4. Pytorch的nn.Conv2d()参数详解

    nn.Conv2d()的使用.形参与隐藏的权重参数   二维卷积应该是最常用的卷积方式了,在Pytorch的nn模块中,封装了nn.Conv2d()类作为二维卷积的实现.使用方法和普通的类一样,先实例 ...

  5. [Pytorch系列-28]:神经网络基础 - torch.nn模块功能列表

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  6. 【小白学习PyTorch教程】三、Pytorch中的NN模块并实现第一个神经网络模型

    「@Author:Runsen」 在PyTorch建立模型,主要是NN模块. nn.Linear nn.Linear是创建一个线性层.这里需要将输入和输出维度作为参数传递. linear = nn.L ...

  7. (pytorch-深度学习)使用pytorch框架nn.RNN实现循环神经网络

    使用pytorch框架nn.RNN实现循环神经网络 首先,读取周杰伦专辑歌词数据集. import time import math import numpy as np import torch f ...

  8. Pytorch学习(二)—— nn模块

    torch.nn nn.Module 常用的神经网络相关层 损失函数 优化器 模型初始化策略 nn和autograd nn.functional nn和autograd的关系 hooks简介 模型保存 ...

  9. pytorch学习(五)---torch.nn模块

            本篇自学笔记来自于b站<PyTorch深度学习快速入门教程(绝对通俗易懂!)[小土堆]>,Up主讲的非常通俗易懂,文章下方有视频连接,如有需要可移步up主讲解视频,如有侵权 ...

最新文章

  1. 如何用java使用POI读取excel文件,创建excel文件,实现批量导出和导入
  2. 算法----左叶子之和
  3. 棋盘最短路径 python_Dijkstra 最短路径算法 Python 实现
  4. html文本长度不一样的对齐,关于html:文本在中间不对齐
  5. 迁移到云端,千万别犯这3个大错误!
  6. linux从一台服务器传输文件到另一台服务器上
  7. Android音视频【十二】使用opensles和audiotrack进行播放pcm
  8. Silverlight 2 跨域访问控件与WebService的资料整理
  9. JavaWeb:JSON对象和Java对象的相互转换
  10. Android开源项目第一篇——个性化控件(View)篇
  11. 分享:映像编辑工具Ghostexp
  12. java 设置图片大小_java 用这个方法如何设置图片大小
  13. Spark数据分析及处理
  14. win10打开软件显示c盘服务器,【解决】win10 打开本地磁盘 提示找不到应用程序...
  15. 概述-数据建模是什么?
  16. Date.getyear()、Date.getMonth()、Date.getDay() 已经作废,其他解决办法
  17. CTE递归 MAXRECURSION 遇到的问题
  18. 地鼠宝宝的轶事奇闻之并发初探
  19. C#Winform中picturebox控件加载图片后无法释放
  20. 第十二周 任务四

热门文章

  1. test.php.bak,MongoDB热备份工具:解决官方版备份缺陷
  2. 小程序循环里做字符串拼接_昨天还在for循环里写加号拼接字符串的那个同事,今天已经不在了...
  3. 字符串、字符数组、字符串数组
  4. Day 02 第二天课时总结
  5. 知识点:Mysql 数据库索引优化实战(4)
  6. [BZOJ 2500] 幸福的道路
  7. PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
  8. 深入 JavaScript(4) - new运算符是如何工作的
  9. SQL Server 2005之PIVOT/UNPIVOT行列转换(转)
  10. 程序模拟键盘鼠标操作