前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Pytorch-卷积神经网络的运算流程(下)

Pytorch-卷积神经网络的运算流程(下)

作者头像
用户6719124
发布于 2019-11-20 06:20:20
发布于 2019-11-20 06:20:20
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

若进行打padding操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
layer = nn.Conv2d(1, 3, kernel_size=3, stride=1, padding=1)
# 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3,步长为1
# padding为1
x = torch.rand(1, 1, 28, 28)
# 随机代入数据到x
out = layer.forward(x)
# 进行一次卷积的前向运算
print(out.size())
# 输出结果的size查看一下

此时输出结果为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.Size([1, 3, 28, 28])

当打补丁后,输出的size与原图片的size一致

若取不同步长时,也会对输出结果造成影响

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
layer = nn.Conv2d(1, 3, kernel_size=3, stride=2, padding=1)
# 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3
# 步长这里为2
x = torch.rand(1, 1, 28, 28)
# 随机代入数据到x
out = layer.forward(x)
# 进行一次卷积的前向运算
print(out.size())
# 输出结果的size查看一下

此时步长取2的输出为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.Size([1, 3, 14, 14])

这种大跨越幅度的读取数据接收的信息量有所减少,进而达到一种降维的目的。

若想查看参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
layer = nn.Conv2d(1, 3, kernel_size=3, stride=2, padding=1)
# 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3
# 步长这里为2
x = torch.rand(1, 1, 28, 28)
# 随机代入数据到x
out = layer.forward(x)
# 进行一次卷积的前向运算
# 输出层间的参数的size查看一下
print(layer.weight.size())

输出为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.Size([3, 1, 3, 3])

这里第一个3代表3个通道,input channel数量为之前的1,3 3 代表了所取的kernel的size。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
layer = nn.Conv2d(1, 3, kernel_size=3, stride=2, padding=1)
# 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3
# 步长这里为2
x = torch.rand(1, 1, 28, 28)
# 随机代入数据到x
out = layer.forward(x)
# 进行一次卷积的前向运算
# 同样可以输出bias进行查看
print(layer.bias.size())

结果为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.Size([3])

验证了之前所取的channel的数量

这里也有其他书写方法

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

w = torch.rand(16, 3, 5, 5)
# 设置观察的kernel数量为16,input channel为3,kernel size为5*5
b = torch.rand(16)
x = torch.rand(1, 1, 28, 28)

out = F.conv2d(x, w, b, stride=1, padding=1)

print(out.size())

此时输出会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Traceback (most recent call last):
    out = F.conv2d(x, w, b, stride=1, padding=1)
RuntimeError: Given groups=1, weight of size 16 3 5 5, expected input[1, 1, 28, 28] to have 3 channels, but got 1 channels instead

报错原因在于input channel数量应该为3, 但所给出的x的input channel数量为1,数据不匹配。

将x数据进行修改即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
w = torch.rand(16, 3, 5, 5)
# 设置观察的kernel数量为16,input channel为3,kernel size为5*5
b = torch.rand(16)
x = torch.rand(1, 3, 28, 28)

out = F.conv2d(x, w, b, stride=1, padding=1)

print(out.size())

此时输出为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.Size([1, 16, 26, 26])

同样这里可以进行stride和padding的设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
w = torch.rand(16, 3, 5, 5)
# 设置观察的kernel数量为16,input channel为3,kernel size为5*5
b = torch.rand(16)
x = torch.rand(1, 3, 28, 28)

out = F.conv2d(x, w, b, stride=2, padding=2)

print(out.size())

输出为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.Size([1, 16, 14, 14])
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
C++入门篇
呀哈喽,我是结衣。 了解完C++的发展历程,我们当然也要会用C++啊。今天这篇博客就是来帮助我们来入门C++的,当然要入门C++当然也要先学会C语言啦。在我学习C++的过程中我会一直把C++博客更新下去的。
Yui_
2024/10/15
1300
C++入门篇
从基础入门到学穿C++(C++语法基础篇)【超详细】【一站式速通】
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
see.
2024/06/04
9270
【C++入门篇】学习C++就看这篇--->命名空间、缺省参数及函数重载
C++总计63个关键字,C语言32个关键字,其实不用记忆,后面随着我们日积月累自然而然就记住了。如下所示:
HABuo
2025/05/15
1180
【C++入门篇】学习C++就看这篇--->命名空间、缺省参数及函数重载
【C++】——入门基础知识超详解
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
小李很执着
2024/06/15
2140
【C++】——入门基础知识超详解
C++初阶-入门基础语法
2. 使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c
用户9645905
2022/11/30
7750
C++初阶-入门基础语法
【C++】C++入门
C语言是结构化和模块化的语言,适合处理小规模的程序,对于复杂的问题、规模较大的程序,需要高度的抽象和建模时,C语言则不合适,这时出现了面向对象的思想,支持面向对象的程序设计语言应运而生
s-little-monster
2024/06/25
3770
【C++】C++入门
C++入门知识(一)
一、#命名空间 在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。 1.命名空间的定义 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
海盗船长
2020/08/27
3870
C屁屁(c++)万字入门
        C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机 界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言 应运而生。         1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而 产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的 程序设计,还可以进行面向对象的程序设计
比特大冒险
2023/04/16
6230
C屁屁(c++)万字入门
初识C++ · 入门(1)
C++与C语言是有一定交集的,可以理解为本贾尼在使用C语言的时候认为有缺陷,于是加了一些小语法进行改良,后来经过委员会的修改,C++98问世了,是第一部标准版本。
_lazy
2024/10/16
740
初识C++ · 入门(1)
从C语言过渡到C++
1979年,贝尔实验室Bjarne Stroustrup 在C语言的基础上,设计开发出了C++语言。C++语言是对C语言的扩充和完善,最初被命名为 “带类的C",1983年更名 “C++”。
秋邱
2024/10/09
1780
[C++]C++基础知识概述
  C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适,为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
IT编程爱好者
2023/04/12
1K0
[C++]C++基础知识概述
【C++入门篇】保姆级教程篇【上】
说到C++大家总会想到C语言,毕竟C++也就是C plus plus 么,没有错,C++在语法上是兼容C语言的。我们C++的祖师爷本贾尼·斯特劳斯特卢普在写C程序的时候对于C的一些语法规则感到不合适,于是祖师爷在C的基础上开发了这样一门语言。今天,我们就要开启C++世界的大门了。
用户11029129
2024/06/04
1840
【C++入门篇】保姆级教程篇【上】
【C++】C++基础语法
     当我们协同完成一个项目时,你定义的变量会不会与其他人定义的变量名冲突???
The sky
2023/04/12
1.5K0
【C++】C++基础语法
【C++入门】命名空间、缺省参数、函数重载
在正式进入C++之前,我们首先要对C++有一个基本的认知。这里我就不过多的进行描述了,有兴趣的可以去网络搜索一番。总而言之,从名称上面我们也可以看得出来,C++是在C的基础上进行不断地优化发展。事实上确实是这样,C语言中90%以上的语法在C++中都适用。
诺诺的包包
2023/02/20
7720
C语言和C++的区别是什么?8个点通俗易懂的告诉你
有些初学的同学傻傻分不清其中的区别,下面我将详细的讲解C语言和C++的区别点。帮助大家尽快的理解。
诸葛青云
2019/04/26
2.6K0
C语言和C++的区别是什么?8个点通俗易懂的告诉你
C++打怪升级(一)- 命名空间、缺省形参、重载
C++相比C语言(32个)引入了更多的(63个)关键字,这一点也可以管中窥豹看出一点C++的复杂。
怠惰的未禾
2023/04/27
9680
C++打怪升级(一)- 命名空间、缺省形参、重载
【C++阅览室】C++入门之过渡C语言
定义命名空间,需要使用到 namespace 关键字 ,后面跟 命名空间的名字 ,然 后接一对 {} 即可, {}
小文要打代码
2024/10/16
800
【C++阅览室】C++入门之过渡C语言
【c++入门】命名空间,缺省参数与函数重载
C++是一种与C语言紧密相关的编程语言。尽管它继承了C语言的许多特点,但C++引入了面向对象编程等概念,并增加了一些自己的特性和关键字来支持这些特性。比较C++和C语言的关键字,我们可以发现以下特征:
用户11029103
2024/03/24
3420
【c++入门】命名空间,缺省参数与函数重载
C++前期概念(重)
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
ljw695
2024/10/18
1300
C++前期概念(重)
C++入门篇1
C++是在C语言的基础上,又容纳了许多面向对象的编程思想,并增加了许多有用的库,以及编程范式,如果以及学习C语言后,对C++的学习也是很有帮助的。 C++补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面,IO方面,函数方面,指针方面,宏方面
Yui_
2024/10/16
1020
C++入门篇1
推荐阅读
相关推荐
C++入门篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验