Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pytorch 学习笔记(一)

pytorch 学习笔记(一)

作者头像
ke1th
发布于 2018-01-02 03:55:03
发布于 2018-01-02 03:55:03
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

pytorch是一个动态的建图的工具。不像Tensorflow那样,先建图,然后通过feedrun重复执行建好的图。相对来说,pytorch具有更好的灵活性。

编写一个深度网络需要关注的地方是: 1. 网络的参数应该由什么对象保存 2. 如何构建网络 3. 如何计算梯度和更新参数

数据放在什么对象中

pytorch中有两种变量类型,一个是Tensor,一个是Variable

  • Tensor: 就像ndarray一样,一维TensorVector,二维TensorMatrix,三维及以上称为Tensor
  • Variable:是Tensor的一个wrapper,不仅保存了值,而且保存了这个值的creator,需要BP的网络都是Variable参与运算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
x  = torch.Tensor(2,3,4) # torch.Tensor(shape) 创建出一个未初始化的Tensor,但是还是可以打印出值的,这个应该是这块内存之前的数据
x                        # 这种方式创建出来的Tensor更多是用来接受其他数据的计算值的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(0 ,.,.) = 
1.00000e-37 *
   1.5926  0.0000  0.0000  0.0000
   0.0000  0.0000  0.0000  0.0000
   0.0000  0.0000  0.0000  0.0000

(1 ,.,.) = 
1.00000e-37 *
   0.0000  0.0000  0.0000  0.0000
   0.0000  0.0000  0.0000  0.0000
   0.0000  0.0000  0.0000  0.0000
[torch.FloatTensor of size 2x3x4]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x.size()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.Size([2, 3, 4])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = torch.rand(2,3,4)
b = torch.rand(2,3,4)
_=torch.add(a,b, out=x)  # 使用Tensor()方法创建出来的Tensor用来接收计算结果,当然torch.add(..)也会返回计算结果的
x
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(0 ,.,.) = 
  0.9815  0.0833  0.8217  1.1280
  0.7810  1.2586  1.0243  0.7924
  1.0200  1.0463  1.4997  1.0994

(1 ,.,.) = 
  0.8031  1.4283  0.6245  0.9617
  1.3551  1.9094  0.9046  0.5543
  1.2838  1.7381  0.6934  0.8727
[torch.FloatTensor of size 2x3x4]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a.add_(b) # 所有带 _ 的operation,都会更改调用对象的值,
#例如 a=1;b=2; a.add_(b); a就是3了,没有 _ 的operation就没有这种效果,只会返回运算结果
torch.cuda.is_available()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
True

自动求导

pytorch的自动求导工具包在torch.autograd

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from torch.autograd import Variable
x = torch.rand(5)
x = Variable(x,requires_grad = True)
y = x * 2
grads = torch.FloatTensor([1,2,3,4,5])
y.backward(grads)#如果y是scalar的话,那么直接y.backward(),然后通过x.grad方式,就可以得到var的梯度
x.grad           #如果y不是scalar,那么只能通过传参的方式给x指定梯度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Variable containing:
  2
  4
  6
  8
 10
[torch.FloatTensor of size 5]

neural networks

使用torch.nn包中的工具来构建神经网络 构建一个神经网络需要以下几步:

  • 定义神经网络的权重,搭建网络结构
  • 遍历整个数据集进行训练
    • 将数据输入神经网络
    • 计算loss
    • 计算网络权重的梯度
    • 更新网络权重
      • weight = weight + learning_rate * gradient
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):#需要继承这个类
    def __init__(self):
        super(Net, self).__init__()
        #建立了两个卷积层,self.conv1, self.conv2,注意,这些层都是不包含激活函数的
        self.conv1 = nn.Conv2d(1, 6, 5) # 1 input image channel, 6 output channels, 5x5 square convolution kernel
        self.conv2 = nn.Conv2d(6, 16, 5)
        #三个全连接层
        self.fc1   = nn.Linear(16*5*5, 120) # an affine operation: y = Wx + b
        self.fc2   = nn.Linear(120, 84)
        self.fc3   = nn.Linear(84, 10)

    def forward(self, x): #注意,2D卷积层的输入data维数是 batchsize*channel*height*width
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv2(x)), 2) # If the size is a square you can only specify a single number
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:] # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

net = Net()
net
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 (400 -> 120)
  (fc2): Linear (120 -> 84)
  (fc3): Linear (84 -> 10)
)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
len(list(net.parameters())) #为什么是10呢? 因为不仅有weights,还有bias, 10=5*2#list(net.parameters())返回的learnable variables 是按照创建的顺序来的
                            #list(net.parameters())返回 a list of torch.FloatTensor objects
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
input = Variable(torch.randn(1, 1, 32, 32))
out = net(input) #这个地方就神奇了,明明没有定义__call__()函数啊,所以只能猜测是父类实现了,并且里面还调用了forward函数
out              #查看源码之后,果真如此。那么,forward()是必须要声明的了,不然会报错
out.backward(torch.randn(1, 10))

使用loss criterion 和 optimizer训练网络

torch.nn包下有很多loss标准。同时torch.optimizer帮助完成更新权重的工作。这样就不需要手动更新参数了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
learning_rate = 0.01
for f in net.parameters():
    f.data.sub_(f.grad.data * learning_rate)  # 有了optimizer就不用写这些了
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch.optim as optim
# create your optimizer
optimizer = optim.SGD(net.parameters(), lr = 0.01)

# in your training loop:
optimizer.zero_grad() # 如果不置零,Variable 的梯度在每次 backward 的时候都会累加。

output = net(input) # 这里就体现出来动态建图了,你还可以传入其他的参数来改变网络的结构

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

整体NN结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):#需要继承这个类
    def __init__(self):
        super(Net, self).__init__()
        #建立了两个卷积层,self.conv1, self.conv2,注意,这些层都是不包含激活函数的
        self.conv1 = nn.Conv2d(1, 6, 5) # 1 input image channel, 6 output channels, 5x5 square convolution kernel
        self.conv2 = nn.Conv2d(6, 16, 5)
        #三个全连接层
        self.fc1   = nn.Linear(16*5*5, 120) # an affine operation: y = Wx + b
        self.fc2   = nn.Linear(120, 84)
        self.fc3   = nn.Linear(84, 10)

    def forward(self, x): #注意,2D卷积层的输入data维数是 batchsize*channel*height*width
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv2(x)), 2) # If the size is a square you can only specify a single number
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:] # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

net = Net()

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

# in your training loop:
for i in range(num_iteations):
    optimizer.zero_grad() # zero the gradient buffers,如果不归0的话,gradients会累加

    output = net(input) # 这里就体现出来动态建图了,你还可以传入其他的参数来改变网络的结构

    loss = criterion(output, target)
    loss.backward() # 得到grad,i.e.给Variable.grad赋值
    optimizer.step() # Does the update,i.e. Variable.data -= learning_rate*Variable.grad

其它

  1. 关于求梯度,只有我们定义的Variable才会被求梯度,由creator创造的不会去求梯度
  2. 自己定义Variable的时候,记得Variable(Tensor, requires_grad = True),这样才会被求梯度,不然的话,是不会求梯度的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# numpy to Tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a) # 如果a 变的话, b也会跟着变,说明b只是保存了一个地址而已,并没有深拷贝
print(b)# Variable只是保存Tensor的地址,如果Tensor变的话,Variable也会跟着变
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = np.ones(5)
b = torch.from_numpy(a)# ndarray --> Tensor
a_ = b.numpy() # Tensor --> ndarray
np.add(a, 1, out=a)# 这个和 a = np.add(a,1)有什么区别呢?
# a = np.add(a,1) 只是将a中保存的指针指向新计算好的数据上去
# np.add(a, 1, out=a) 改变了a指向的数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 将Tensor放到Cuda上
if torch.cuda.is_available():
    x = x.cuda()
    y = y.cuda()
    x + y
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# torch.Tensor(1,2,3) 与 torch.Tensor([1,2,3]) 的区别
torch.Tensor(1,2,3) # 生成一个 shape 为 [1,2,3] 的 tensor
torch.Tensor([1,2,3]) # 生成一个值为 [1,2,3] 的 tensor
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# tensor 与 numpy
import torch
from torch.autograd import Variable
import numpy as np
n1 = np.array([1., 2.]).astype(np.float32)
# t1 = torch.FloatTensor(n1)
t1 = torch.from_numpy(n1)
n1[0] = 2.
print(t1)
# 可以看出,当使用 无论是使用 FloatTensor 还是 from_numpy 来创建 tensor
# tensor 只是指向了 初始的值而已,而没有自己再开辟空间。
# FloatTensor(2,3,2) 这个不一样,它是开辟了一个 空间。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyTorch60分钟教程学习笔记基本概念网络构建分类网络搭建,训练与测试
基本概念 Tensor tensor是的含义是张量,简单的理解可以将其当成三维矩阵,pytorch中的张量是对数据的一种封装,也是数据结构中最核心的部分之一。对于pytorch中的张量,数组可能是更好的理解方法。 Tensor的定义 直接定义矩阵,使用torch.Tensor(shape)方法定义未初始化的张量,使用torch.rand(shape)或torch.randn(shape)定义随机张量 import torch as pt x = pt.Tensor(2,4) print(x) # 1.000
月见樽
2018/04/27
1.1K0
Pytorch 神经网络训练过程
文章目录 1. 定义模型 1.1 绘制模型 1.2 模型参数 2. 前向传播 3. 反向传播 4. 计算损失 5. 更新参数 6. 完整简洁代码 参考 http://pytorch123.com/ 1. 定义模型 import torch import torch.nn as nn import torch.nn.functional as F class Net_model(nn.Module): def __init__(self): super(Net_model, se
Michael阿明
2021/02/19
4640
Pytorch 神经网络训练过程
PyTorch 60分钟入门系列之神经网络
前面的学习大致了解了autograd,nn依赖于autograd来定义模型并进行求导。一个nn.Module包含多个神经网络层,以及一个forward(input)方法来返回output。
AI异构
2020/07/29
5080
PyTorch 60分钟入门系列之神经网络
【小白学习PyTorch教程】六、基于CIFAR-10 数据集,使用PyTorch 从头开始​​构建图像分类模型
图像识别本质上是一种计算机视觉技术,它赋予计算机“眼睛”,让计算机通过图像和视频“看”和理解世界。
润森
2022/08/18
1.9K0
【小白学习PyTorch教程】六、基于CIFAR-10 数据集,使用PyTorch 从头开始​​构建图像分类模型
60题PyTorch简易入门指南,做技术的弄潮儿!
48.构造一个transform,将三通道(0,1)区间的数据转换成(-1,1)的数据
Datawhale
2020/02/14
1K0
Pytorch_hook机制的理解及利用register_forward_hook(hook)中间层输出[通俗易懂]
【2】pytorch改动和.data和.detch()问题:https://blog.csdn.net/dss_dssssd/article/details/83818181
全栈程序员站长
2022/11/17
2K0
Pytorch_hook机制的理解及利用register_forward_hook(hook)中间层输出[通俗易懂]
教程 | 从头开始了解PyTorch的简单实现
选自GitHub 机器之心编译 参与:路 本教程展示了如何从了解张量开始到使用 PyTorch 训练简单的神经网络,是非常基础的 PyTorch 入门资源。PyTorch 建立在 Python 和 Torch 库之上,并提供了一种类似 Numpy 的抽象方法来表征张量(或多维数组),它还能利用 GPU 来提升性能。本教程的代码并不完整,详情请查看原 Jupyter Notebook 文档。 PyTorch 使入门深度学习变得简单,即使你这方面的背景知识不太充足。至少,知道多层神经网络模型可视为由权重连接的节
机器之心
2018/05/08
3.1K0
教程 | 从头开始了解PyTorch的简单实现
Deep Learning with PyTorch: A 60 Minute Blitz > Neural Networks
Neural networks can be constructed using the torch.nn package.
望天
2024/06/12
2050
Deep Learning with PyTorch: A 60 Minute Blitz > Neural Networks
【PyTorch入门】使用PyTorch构建一个简单的图像分类模型
机器学习司猫白
2025/01/21
3690
【PyTorch入门】使用PyTorch构建一个简单的图像分类模型
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了
本文通过详细且实践性的方式介绍了 PyTorch 的使用,包括环境安装、基础知识、张量操作、自动求导机制、神经网络创建、数据处理、模型训练、测试以及模型的保存和加载。
TechLead
2023/10/21
6.9K0
Pytorch 最全入门介绍,Pytorch入门看这一篇就够了
【深度学习】翻译:60分钟入门PyTorch(三)——神经网络
原文翻译自:Deep Learning with PyTorch: A 60 Minute Blitz
黄博的机器学习圈子
2021/02/12
7720
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视觉等)、大数据、编程语言、系统架构。使用请访问专知 进行主题搜索查看 - 桌面电脑访问www.zhuanzhi.ai, 手机端访问www.zhuanzhi.ai 或关注微信公众号后台回复" 专知"进入专知,搜索主题查看。值国庆佳节,专知特别推出独家特刊-来自中科院自动化所专知小组博士生huaiwen和Jin创作的-PyTorch教程学习系列。 <
WZEARW
2018/04/08
2.2K0
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
60分钟快速入门PyTorch
本文是翻译自官方版教程--DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ,一份 60 分钟带你快速入门 PyTorch 的教程。
kbsc13
2020/05/22
1.3K0
60分钟快速入门PyTorch
使用PyTorch构建的“感知器”网络
PyTorch是一个很棒的深度学习框架,简单易学。本篇文章将带领大家从头开始构建一个“原始”的神经网络。
小白学视觉
2020/10/26
6010
使用PyTorch构建的“感知器”网络
stn  pytorch[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/02
2980
Pytorch实现STN
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import torchvision from torchvision import datasets, transforms import matplotlib.pyplot as plt import numpy as np class TPSNet(nn.Module): def __init__(self): super(TPSNet, self).__init__() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) # Spatial transformer localization-network self.localization = nn.Sequential( nn.Conv2d(in_channels=1, out_channels=8, kernel_size=7), nn.MaxPool2d(kernel_size=2, stride=2), nn.ReLU(True), nn.Conv2d(in_channels=8, out_channels=10, kernel_size=5), nn.MaxPool2d(kernel_size=2, stride=2), nn.ReLU(True) ) # Regressor for the 3 * 2 affine matrix self.fc_loc = nn.Sequential( nn.Linear(10 * 3 * 3, 32), nn.ReLU(True), nn.Linear(32, 3 * 2) ) # Initialize the weights/bias with identity transformation self.fc_loc[2].weight.data.fill_(0) self.fc_loc[2].bias.data = torch.FloatTensor([1, 0, 0, 0, 1, 0]) # Spatial transformer network forward function def stn(self, x): #x是[b,1,28,28] xs = self.localization(x) #xs是[b,10,3,3] xs = xs.view(-1, 10 * 3 * 3) #xs是[b,90] theta = self.fc_loc(xs) #theta是[b,6] theta = theta.view(-1, 2, 3) grid = F.affine_grid(theta, x.size()) x = F.grid_sample(x, grid) #x是[b,1,28,28] return x def forward(self, x): # transform the input #x是[b,1,28,28] x = self.stn(x) #x是[b,1,28,28] # Perform the usual forward pass x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.log_softmax(x, dim=1) def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): if use_cuda: data, target = data.cuda(), target.cuda() optimizer.zero_grad() output = model(data) loss = F.nll_loss(output, target) #和TPSNet中的log_softmax搭配,就是CE loss loss.backward() optimizer.step() if batch_idx
全栈程序员站长
2022/11/02
4790
Pytorch实现STN
【机器学习实战】从零开始深度学习(通过GPU服务器进行深度学习)
0.1. 利用GPU加速深度学习   疫情期间没有办法用实验室的电脑来跑模型,用领取的腾讯云实例来弄刚刚好。发现如果没有GPU来跑的话真的是太慢了,非常推荐利用GPU加速深度学习的训练速度。     如果采用GPU的话,训练函数train_model(*)中数据的输入要改变一下,也就是需要将数据放在GPU上
汉堡888
2022/05/03
8.9K0
【机器学习实战】从零开始深度学习(通过GPU服务器进行深度学习)
最新翻译的官方 PyTorch 简易入门教程
https://github.com/fengdu78/machine_learning_beginner/tree/master/PyTorch_beginner
用户1737318
2019/11/19
1.6K0
最新翻译的官方 PyTorch 简易入门教程
PyTorch的简单实现
PyTorch 的关键数据结构是张量,即多维数组。其功能与 NumPy 的 ndarray 对象类似,如下我们可以使用 torch.Tensor() 创建张量。如果你需要一个兼容 NumPy 的表征,或者你想从现有的 NumPy 对象中创建一个 PyTorch 张量,那么就很简单了。
代码的路
2022/06/18
2K0
PyTorch的简单实现
快速入门PyTorch(2)--如何构建一个神经网络
在 PyTorch 中 torch.nn 专门用于实现神经网络。其中 nn.Module 包含了网络层的搭建,以及一个方法-- forward(input) ,并返回网络的输出 outptu .
kbsc13
2019/08/16
5020
推荐阅读
相关推荐
PyTorch60分钟教程学习笔记基本概念网络构建分类网络搭建,训练与测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验