基于pytorch的CNN计算简介

1. CNN简介

本文主要介绍利用pytorch对CNN的计算有一个直观的认识,在此认为你已经对CNN有了一些理解,但是对如何计算还有一些迷糊。
卷积神经网络的结构一般用在图像处理领域,优化了全连接神经网络的参数过多问题。CNN的结构图如下所示,一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。常用的架构模式为:
INPUT -> [[conv]*N -> Pooling?]*M -> [FC]*K
其中Pooling层不一定要有,参考如下的架构图。关于CNN的细节不做太多介绍,具体可以参考这篇文章

卷积图.png

2. pytorch计算卷积CNN

2.1 pytorch的cnn实现函数介绍

首先介绍一下pytorch实现cnn的函数
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

  • in_channels, out_channels为输入输出信号的通道;
  • kernel_size为卷积核的大小,可以为int or (height, width),int时表示卷积核是高宽相等的,为touple表示卷积核的高度和宽度不相等;
  • stride 同样可以为int or touple,参考kernel_size,卷积步长高度和宽度两个方向不等时候,采用touple;
  • padding int or (height, width) 输入的每一条边补充0的层数;
  • dilation(int or tuple, `optional``) – 卷积核元素之间的间距,默认为1,为2时候,卷积核元素之间的间距拉大,相当于放大了卷积核看到的区域;
  • bias bias为True,添加偏置;
  • groups(int, optional) – 从输入通道到输出通道的阻塞连接数
    举个例子:
import torch as t
from torch import nn
m = nn.Conv2d(in_channels=8,out_channels=3,kernel_size= 3)
input = t.randn(10, 8,5,5 )
output = m(input)
output.shape
>>>
torch.Size([10, 2, 3, 3])

这里的input为batch10,深度为8,高度和宽度都为5的三维矩阵(在此解释一下,明明是3维矩阵,却为啥是conv2d,二维的呢,个人理解是,这里的2d是针对有高度和宽度,卷积核在这两个方向上移动,所以虽然输入的是三维矩阵,但是只在两个方向上移动,所以是Conv2d)。通过卷积核为355的卷积核后,output的高度和宽度为3(5-3+1)。
卷积变换的高度和宽度的计算公式为:
W_2 = (W_1-F+2P)/S+1 \\H_2 = (H_1-F+2P)/S+1
其中W_2为卷积变换之后的高度,F为卷积核的宽度,P为补0的圈数。

2.2 理解卷积的计算方法

卷积神经网络是如何计算的呢,下面是一张非常经典的图,input是一个深度为3的7*7的数据,2channel的filter,filter的深度要和input的深度 一致,因此CNN输出矩阵的大小和filter有如下规范:

  • filter 的深度要和input的深度一致;
  • 卷积神经网络的输出的channel是由filter的channel数决定的;
  • 输出的高度和宽度由卷积核的高度和宽度、卷积的步长straddle、补零padding的圈数决定的;
    卷积的计算方法可以参考下方的动态图,画的非常清晰,filter和input做element-wise的相乘,不同层之间进行求和,最后加上bias,得到output。
2256672-958f31b01695b085.gif

接下来,我们再继续使用pytorch实践一下计算过程:

import torch.nn.functional as f
input = t.randn(1,3,3,3) # 输入为batch为2,深度为2的3*3矩阵
filter1 = t.randn(2,3,2,2) # 卷积核即filter为(3,2,2,2),即channel为3,卷积核的深度为2,高宽为2*2
o1 = f.conv2d(input, filter1,stride=1) #因此输出的维度为(2,3,2,2)
input
>>>
Out[18]:
tensor([[[[-0.1759, -0.3417,  1.4123],
          [-1.6696,  0.9701, -2.3805],
          [-0.7241, -0.2209, -0.8992]],

         [[-1.3623,  0.8210,  0.7222],
          [ 0.5904,  0.0083, -1.5792],
          [ 0.3217, -0.8068,  0.7589]],

         [[-0.5402,  1.2805,  0.7455],
          [-0.8920, -1.0816,  1.1012],
          [-0.0124, -1.6899,  1.2731]]]])
filter1
>>>
tensor([[[[-1.8587e+00,  1.2517e+00],
          [-6.4202e-01,  5.6213e-01]],

         [[-2.1839e-01, -1.9386e-01],
          [ 7.2792e-01, -1.9432e+00]],

         [[-1.7671e+00, -1.4224e+00],
          [-1.5365e+00, -1.1106e+00]]],


        [[[ 1.8957e+00,  5.6250e-01],
          [-1.9311e+00, -8.1737e-02]],

         [[ 7.7985e-01, -1.3875e-01],
          [-8.8998e-01, -1.1328e+00]],

         [[ 5.6669e-01, -1.1629e+00],
          [ 3.2056e-01, -7.1626e-04]]]])
o1
>>>
Out[19]:
tensor([[[[ 3.7735,  0.3129],
          [11.3403, -5.3765]],

         [[-1.1724,  0.3006],
          [ 0.6336, -1.3521]]]])

如上可以看到第一个元素o1[0,0,0,0]是3.7735,接下来我们人肉计算一下第一个元素:

import torch as t
t.sum(input[0,:,0:2,0:2]*filter1[0,:,:,:])
>>>
out[20]
tensor(3.7735)

结果和利用nn.functional.Conv2d计算出的结果一致。
nn.Conv2d和nn.functional.Conv2很相似,但是在构建模型的时候一般采用nn.Conv2d来实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342