今天,我们来分享一篇博文,关于如何计算图像张量的大小以及确定卷积神经网络各层参数个数的公式。假设我们已经熟悉了卷积神经网络相关概念。在这里,我们把张量定义为有任意通道数的图像。

张量是在深度学习中表示数据的标准方式。
简单来说,张量是二维表(矩阵)到更高维的扩展。

有效AttributeError: module ‘tensorflow’ has no attribute "…"解决办法
一般,这是由于版本不兼容的问题,中间加上compat.v1

tf.compat.v1.placeholder

我们将用AlexNet作为例子,在这里我们把AlexNet的结构拿来参考。

在这里,我们先来了解AlexNet的结构

  1. 输入层:彩色图片的大小2272273
  2. 卷积层1:96 kernels 11*11 步长4 零边距填充
  3. 最大池化层1:3*3 步长2 避免平均池化的模糊化效果
  4. 卷积层2:256 kernels 5*5 步长1 填充2
  5. 最大池化层2:3*3 步长2 避免平均池化的模糊化效果
  6. 卷积层3:384 kernels 3*3 步长1 填充1
  7. 卷积层4:384 kernels 3*3 步长1 填充1
  8. 卷积层2:256 kernels 3*3 步长1 填充1
  9. 最大池化层3:3*3 步长2 避免平均池化的模糊化效果
  10. 全连接层1:4096神经元
  11. 全连接层2:4096神经元
  12. 全连接层3:1000神经元
    其中,最大池化是可重叠的,步长小于窗口宽度。分批(Batches) 和 周期(Epochs)在使用训练集训练神经网络的时候,相比于一次将所有的样本全部输入到网络中,一个更好的选择是:先将数据随机地分为几个大小一致的数据块,再分批次输入。跟一次性训练出来的模型相比,分批训练能够使模型的适用性更好。一个Epoch表示,对所有的Batch都进行了一次训练。

AlexNet 的特点如下:

更深的网络结构
使用层叠的卷积层,即卷积层+卷积层+池化层来提取图像的特征
使用Dropout抑制过拟合
使用数据增强Data Augmentation抑制过拟合
使用Relu替换之前的sigmoid的作为激活函数
多GPU训练

其中,数据增强部分,神经网络由于训练的参数多,表能能力强,所以需要比较多的数据量,不然很容易过拟合。当训练数据有限时,可以通过一些变换从已有的训练数据集中生成一些新的数据,以快速地扩充训练数据。对于图像数据集来说,可以对图像进行一些形变操作:翻转/随机裁剪/平移,颜色光照的变换

下面,重点来了:
卷积神经网络的参数个数和张量大小(翻译),每一层具体的练习结果参考上方链接。

确定张量大小

How to calculate the tensor size at each stage
How to calculate the total number of parameters in the network

我们先来明确各变量名称

变量 含义
O 输出图像的大小
I 输入图像的大小
K 卷积层所用卷积核大小
N 卷积核数量
S 步长
P 边界填补

卷积层输出张量大小

O=I−K+2PS+1O= \frac{I-K+2P}{S}+1O=SI−K+2P​+1
输出图像的通道个数等于我们使用的卷积核的个数。
例如:在 AlexNet,输入图像大小为227∗227∗3227*227*3227∗227∗3,第一个卷积层有96个11∗11∗311*11*311∗11∗3卷积核,步长为4,没有边界填充。第一个卷积层输出大小便是
O=227−11+2∗04+1=55O = \frac{227-11+2*0}{4}+1 = 55O=4227−11+2∗0​+1=55
输出张量大小为555596
在 LeNet,输入图像大小为32321,第一个卷积层有6个551卷积核,步长为1,边界填充和输入相同。
第一个卷积层输出大小便是?
O=32−5+2∗01+1=28O = \frac{32-5+2*0}{1}+1 = 28O=132−5+2∗0​+1=28
输出张量大小为28∗28∗628*28*628∗28∗6

# Conv2D layerX = keras.layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='same', name="leNet5_conv1")(X_in)

池化层输出张量大小

变量 含义
O 输出图像的大小
I 输入图像的大小
S 步长
PsP_sPs​ 池化大小

O=I−PsS+1O=\frac{I-P_s}{S}+1O=SI−Ps​​+1
这个公式可以从卷积层公式推导出来,只需要把边界填充看作0,让池化大小等价于卷积核大小。需要注意的是,池化层并不改变输出通道的大小。假设本层输入张量大小为28286
O=28−21+1O=\frac{28-2}{1}+1O=128−2​+1
输出张量大小为27276

 # Pooling layerX = keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(1, 1), padding='valid')(X)

全连接层的输出张量大小

等价于该层的神经元的个数

def leNet5(input_shape):"""Define the LeNet-5Input:input_shape [tuple]: shape of input image (height, width, channel)Output:model (a tensorflow model instance)"""# Input layerX_in = keras.layers.Input(shape=input_shape)# Conv2D layerX = keras.layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='same', name="leNet5_conv1")(X_in)# Pooling layerX = keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(1, 1), padding='valid')(X)# Conv2DX = keras.layers.Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='valid', name='leNet5_conv2')(X)# Pooling layerX = keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid')(X)# Conv2DX = keras.layers.Conv2D(filters=120, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='valid', name='leNet5_conv3')(X)# Flatten CNN output so that it can be connected to dense layerX = keras.layers.Flatten()(X)# DenseX = keras.layers.Dense(84, activation='tanh')(X)# Output layery = keras.layers.Dense(10, activation='softmax')(X)model = keras.Model(inputs=X_in, outputs=y, name='leNet5')return model

确定参数大小

变量 含义
WcW_cWc​ 卷积权重
BcB_cBc​ 卷积偏置
P 卷积层所用参数数量
N 卷积核数量
K 卷积核大小(宽度)
C 输入图像的通道

Wc=K2∗C∗NW_c = K^2*C*NWc​=K2∗C∗N
Bc=NB_c = NBc​=N
Pc=Wc+BcP_c = W_c + B_cPc​=Wc​+Bc​

卷积层的参数

CNN里面,有两种参数,权重和偏置

全连接层的参数

全连接层与全连接层相互连接的参数,感性认识,F 代表全连接层含有的神经元个数,F−1F_{-1}F−1​代表上一个全连接层含有的神经元个数$$
参考人工智能实验课——神经网络手写数字识别学习笔记(二)

Wff=F−1∗FW_{ff} = F_{-1}*FWff​=F−1​∗F
Bff=FB_{ff} = FBff​=F
Pff=Wff+BffP_{ff} = W_{ff} + B_{ff}Pff​=Wff​+Bff​
全连接层与卷积层相互连接的参数

变量 含义
WcfW_{cf}Wcf​ FC卷积权重
BcfB_{cf}Bcf​ FC卷积偏置
O 上一卷积层输出张量大小
N 上一卷积层的卷积核个数
F FC 神经元个数

Wcf=O2∗N∗FW_{cf} = O^2 * N*FWcf​=O2∗N∗F
Bcf=FB_{cf} = FBcf​=F
Pcf=Wcf+BcfP_{cf} = W_{cf}+B_{cf}Pcf​=Wcf​+Bcf​

今日写CSDN的背景音乐是:)
The Music of the Night (From “The Phantom of the Opera”)

Night-time sharpens, heightens each sensation
夜色渐暗,激发灵感
Darkness stirs and wakes imagination
黑暗作祟,唤醒想像空间
Silently the senses abandon their defenses
潜移默化,感官放弃抵抗

Slowly, gently, night unfurls its splendor
缓缓的,轻柔的,夜色展现光彩
Grasp it,sense it, tremulous and tender
抓住它,感受它,颤栗而轻柔
Turn your face away form the garish light of day
别再回顾炫彩夺目的白天
Turn your thoughts away from cold unfeeling light
别再想那些冷酷无情的光线
And listen to the music of the night
聆听这暗夜的乐音吧

深度神经网络TensorFlow基础学习(3)——卷积神经网络的参数个数和张量大小相关推荐

  1. 深度学习~卷积神经网络(CNN)概述

    目录​​​​​​​ 1. 卷积神经网络的形成和演变 1.1 卷积神经网络结构 1.2 卷积神经网络的应用和影响 1.3 卷积神经网络的缺陷和视图 1.3.1 缺陷:可能错分 1.3.2 解决方法:视图 ...

  2. 深度学习之卷积神经网络(4)LeNet-5实战

    深度学习之卷积神经网络(4)LeNet-5实战 加载数据集 创建网络 训练阶段 测试阶段 完整代码  1990年代,Yann LeCun等人提出了用于手写数字和机器打印字符图片识别的神经网络,被命名为 ...

  3. 深度学习:卷积神经网络CNN入门

    作者:机器之心 链接:https://www.zhihu.com/question/52668301/answer/131573702 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  4. 一网打尽深度学习之卷积神经网络的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)

    看过的最全最通俗易懂的卷积神经网络的经典网络总结,在此分享,供更多人学习. 一.CNN卷积神经网络的经典网络综述 下面图片参照博客:http://blog.csdn.net/cyh_24/articl ...

  5. 深度学习之卷积神经网络(12)深度残差网络

    深度学习之卷积神经网络(12)深度残差网络 ResNet原理 ResBlock实现 AlexNet.VGG.GoogleLeNet等网络模型的出现将神经网络的法阵带入了几十层的阶段,研究人员发现网络的 ...

  6. 深度学习之卷积神经网络(11)卷积层变种

    深度学习之卷积神经网络(11)卷积层变种 1. 空洞卷积 2. 转置卷积 矩阵角度 转置卷积实现 3. 分离卷积 卷积神经网络的研究产生了各种各样优秀的网络模型,还提出了各种卷积层的变种,本节将重点介 ...

  7. 深度学习之卷积神经网络(10)CIFAR10与VGG13实战

    深度学习之卷积神经网络(10)CIFAR10与VGG13实战 MNIST是机器学习最常用的数据集之一,但由于手写数字图片非常简单,并且MNIST数据集只保存了图片灰度信息,并不适合输入设计为RGB三通 ...

  8. 深度学习之卷积神经网络(8)BatchNorm层

    深度学习之卷积神经网络(8)BatchNorm层 BatchNorm层概念 BatchNorm层实现 1. 向前传播 2. 反向更新 3. BN层实现 4. 完整代码 卷积神经网络的出现,网络参数量大 ...

  9. 深度学习之卷积神经网络(3)卷积层实现

    深度学习之卷积神经网络(3)卷积层实现 1. 自定义权值 2. 卷积层类  在TensorFlow中,既可以通过自定义权值的底层实现方式搭建神经网络,也可以直接调用现成的卷积层类的高层方式快速搭建复杂 ...

最新文章

  1. AI市场扩大催生多样化标注需求
  2. python turtle循环图案-有趣的Python turtle绘图
  3. vue中向数组去重_「前端剑指offer第3期」来,手写一下数组去重
  4. java 创建文件夹的方法_Java创建文件夹的方法
  5. Angular:why click add button does not work for the second time
  6. 【转】译文:.net 程序员易犯的7个通病
  7. 用数据库的方式编辑上一页 下一页
  8. vue实现部分页面导入底部 vue配置公用头部、底部,可控制显示隐藏
  9. 转《js闭包与内存泄漏》
  10. live555学习笔记-RTP打包与发送
  11. “导航技术”学习笔记
  12. 计算机网络 | 无盘工作站的建立
  13. OSError: exception: access violation writing 0x0000000000000000
  14. 按照拼音对数组中的中文字符串排序的算法
  15. 2022-2028年全球与中国SCADA石油和天然气行业发展趋势及投资战略分析
  16. 肖维勒准则matlab_莱因达 ( PauTa)准则、格拉布斯 ( Grubbs)准则、肖维纳 (Chauvenet)准则 三者的区别...
  17. 当我们谈战略,我们究竟在谈什么?
  18. Python网络爬虫:爬取CSDN热搜数据 并保存到本地文件中
  19. Android桌面控件Widget解析
  20. 使用函数求e的近似值 C语言 PTA

热门文章

  1. 自定义控件实现(淘宝头条/京东快报)垂直循环滚动栏目
  2. String 类 TRYTRY
  3. 这,不是我想要的生活
  4. java 简单背包问题_简单的背包问题--java递归实现
  5. java毕业设计飞机航班信息查询系统演示视频2021源码+系统+数据库+lw文档+调试运行
  6. Zookeeper报错Will not attempt to authenticate using SASL解决办法
  7. OpenSSL C++简单应用
  8. 将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。输出逆序后数组的整数,每两个整数之间用空格分隔。
  9. csv加header python_用python处理csv格式文件
  10. 云和恩墨携手华为:让数据成就价值