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

  • 1. 自定义权值
  • 2. 卷积层类

 在TensorFlow中,既可以通过自定义权值的底层实现方式搭建神经网络,也可以直接调用现成的卷积层类的高层方式快速搭建复杂网络。我们主要以2D卷积为例,介绍如何实现卷积神经网络层。

1. 自定义权值

 在TensorFlow中,通过tf.nn.conv2d函数可以方便地实现2D卷积运算。tf.nn.conv2d基于输入X:[b,h,w,cin]\boldsymbol X:[b,h,w,c_{in}]X:[b,h,w,cin​]和卷积核W:[k,k,cin,cout]\boldsymbol W:[k,k,c_{in},c_{out}]W:[k,k,cin​,cout​]进行卷积运算,得到输出O:[b,h′,w′,cout]\boldsymbol O:[b,h',w',c_{out}]O:[b,h′,w′,cout​],其中cinc_{in}cin​表示输入通道数,coutc_{out}cout​表示卷积核的数量,也是输出特征图的通道数。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
# 需要根据[k,k,cin,cout]格式创建w张量,4个3*3大小的卷积核
w = tf.random.normal([3, 3, 3, 4])
# 步长为1,padding为0
out = tf.nn.conv2d(x, w, strides=1, padding=[[0, 0], [1, 1], [1, 1], [0, 0]])
# 输出张量的shape
print('out.shape=', out.shape)

运行结果如下图所示:

其中padding参数的设置格式为:

padding=[[0, 0], [上, 下], [左, 右], [0, 0]]

例如,上下左右各填充一个单位,则padding参数设置为[[0,0],[1,1],[1,1],[0,0]][[0,0],[1,1],[1,1],[0,0]][[0,0],[1,1],[1,1],[0,0]],实现如下:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
# 需要根据[k,k,cin,cout]格式创建w张量,4个3*3大小的卷积核
w = tf.random.normal([3, 3, 3, 4])
# 步长为1,padding为1
out = tf.nn.conv2d(x, w, strides=1, padding=[[0, 0], [1, 1], [1, 1], [0, 0]])
# 输出张量的shape
print('out.shape=', out.shape)

运行结果如下图所示:

 特别地,通过设置参数padding=‘SAME’strides=1可以直接得到输入、输出同大小的卷积层,其中padding的具体数量由TensorFlow自动计算并完成填充操作。例如:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
# 需要根据[k,k,cin,cout]格式创建w张量,4个3*3大小的卷积核
w = tf.random.normal([3, 3, 3, 4])
# 步长为1,padding设置为输入、输出同大小
# 需要注意的是,padding=same只有在strides=1时才是同大小
out = tf.nn.conv2d(x, w, strides=1, padding='SAME')
# 输出张量的shape
print('out.shape=', out.shape)

运行结果如下图所示:

当s<1时,设置padding=‘SAME’将使得输出高、宽将成1s\frac{1}{s}s1​倍地减少。例如:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
# 需要根据[k,k,cin,cout]格式创建w张量,4个3*3大小的卷积核
w = tf.random.normal([3, 3, 3, 4])
# 高宽先padding成可以整除3的最小整数6,然后6按3倍减少,得到2*2
out = tf.nn.conv2d(x, w, strides=3, padding='SAME')
# 输出张量的shape
print('out.shape=', out.shape)

运行结果如下图所示:

 卷积神经网络层与全连接层一样,可以设置网络带偏置向量。tf.nn.conv2d函数是没有实现偏置向量计算的,添加偏置只需要手动累加偏置向量即可。例如:

# 根据[out]格式创建偏置向量
b = tf.zeros([4])
# 在卷积输出上叠加偏置向量,它会自动broadcasting为[b,h',w',cout]
out = out + b

2. 卷积层类

 通过卷积层类layers.Conv2D可以不需要手动定义卷积核W\boldsymbol WW和偏置b\boldsymbol bb张量,直接调用类实例即可完成卷积层的向前计算,实现更加高层和快捷。在TensorFlow中,API的命名有一定的规律,首字母大写的对象一般表示类,全部小写的一般表示函数,如layers.Conv2D表示卷积层类,nn.conv2d表示卷积运算函数。使用类方式会(在创建类时或build时)自动创建需要的权值张量和偏置向量等,用户不需要记忆卷积核张量的定义格式,因此使用起来更简单方便,但是灵活性也略低。函数方式的接口需要自行定义权值和偏置等,更加灵活和底层。

 在新建卷积层类时,只需要指定卷积核数量参数filters,卷积核大小kernel_size,步长strides,填充padding等即可。如下创建了4个3×33×33×3大小的卷积核的卷积层,步长为1,padding方案为‘SAME’:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
layer = layers.Conv2D(4, kernel_size=3, strides=1, padding='SAME')
out = layer(x)
print(out.shape)

运行结果如下图所示:

 果卷积核高宽不等,步长行列方向不等,此时需要将kernel_size参数设计为tuple格式(kh,kw)(k_h,k_w)(kh​,kw​),strides参数设计为(sh,sw)(s_h,s_w)(sh​,sw​)。如下创建4个3×43×43×4大小的卷积核,竖直方向移动步长sh=2s_h=2sh​=2,水平方向移动步长为sw=1s_w=1sw​=1:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
layer = layers.Conv2D(4, kernel_size=(3, 4), strides=(2, 1), padding='SAME')
out = layer(x)
print(out.shape)

运行结果如下图所示:

 创建完成后,通过调用实例即可完成向前计算,例如:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
layer = layers.Conv2D(4, kernel_size=3, strides=1, padding='SAME')
out = layer(x)
print(out.shape)

 在类Conv2D中,保存了卷积核张量W\boldsymbol WW和偏置b\boldsymbol bb,可以通过类成员trainable_variables直接返回W\boldsymbol WW和b\boldsymbol bb的列表,例如:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential, losses, optimizers, datasetsx = tf.random.normal([2, 5, 5, 3])  # 模拟输入,3通道,高宽为5
layer = layers.Conv2D(4, kernel_size=3, strides=1, padding='SAME')
out = layer(x)
print(out.shape)
# 输出所有待优化张量列表
print(layer.trainable_variables)

运行结果如下所示:

(2, 5, 5, 4)
[<tf.Variable 'conv2d/kernel:0' shape=(3, 3, 3, 4) dtype=float32, numpy=
array([[[[-0.06861021,  0.15635735,  0.23594084,  0.08823672],[-0.07579896,  0.28215882, -0.07285108,  0.15759888],[-0.04988965, -0.21231258, -0.08478491,  0.16820547]],…,dtype=float32)>, <tf.Variable 'conv2d/bias:0' shape=(4,) dtype=float32, numpy=array([0., 0., 0., 0.], dtype=float32)>]

通过调用`layer.trainable_variables可以返回Conv2D类维护的W\boldsymbol WW和b\boldsymbol bb张量,这个类成员在获取网络层的待优化变量时非常有用。也可以直接调用类实例layer.kernel、layer.bias名访问W\boldsymbol WW和b\boldsymbol bb张量。

深度学习之卷积神经网络(3)卷积层实现相关推荐

  1. 神经网络的输出层有哪些_深度学习的数学-神经网络、输入层、隐藏层、输出层...

    前言 前文中了解到,神经网络由多个神经单元组成,而本篇博客将会了解到深度学习由多个神经网络组成,并且分为 输入层.隐藏层和输出层,隐藏层涉及到的知识点最多,是本文的重点 正文 阶层型的神经网络主要结构 ...

  2. 【深度学习】深入浅出神经网络框架的模型元件(池化、正则化和反卷积层)

    [深度学习]深入浅出神经网络框架的模型元件(池化.正则化和反卷积层) 文章目录 1 池化层 1.1 MaxPooling2D 1.2 MaxPooling1D: 1.3 AveragePooling2 ...

  3. 【深度学习】深入浅出神经网络框架的模型元件(常用层和卷积层)

    [深度学习]深入浅出神经网络框架的模型元件(常用层和卷积层) 文章目录 1 常用层1.1 Dense1.2 Activation层1.3 Dropout1.4 Flatten 2 卷积层2.1 Cov ...

  4. 花书+吴恩达深度学习(十二)卷积神经网络 CNN 之全连接层

    目录 0. 前言 1. 全连接层(fully connected layer) 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 CNN ...

  5. 卷积神经网络之卷积计算、作用与思想 深度学习

    博客:blog.shinelee.me | 博客园 | CSDN 卷积运算与相关运算 在计算机视觉领域,卷积核.滤波器通常为较小尺寸的矩阵,比如3×33×3.从这个角度看,多层卷积是在进行逐层映射,整 ...

  6. 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战 卷积神经网络,听起来像是计算机科学.生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力 ...

  7. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(一)

    [深度学习]基于Pytorch的卷积神经网络API妙用(一) 文章目录 1 不变性 2 卷积的数学分析 3 通道 4 互相关运算 5 图像中目标的边缘检测 6 基于Pytorch的卷积核 7 特征映射 ...

  8. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)

    [深度学习]基于Pytorch的卷积神经网络API妙用(二) 文章目录1 Padding和Stride 2 多输入多输出Channel 3 1*1 Conv(笔者在看教程时,理解为降维和升维) 4 池 ...

  9. 4.7 CNN 特征可视化-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 4.6 什么是神经风格转换? 回到目录 4.8 代价函数 CNN 特征可视化 (What are deep ConvNets learning?) 深度卷积网络到底在学什么? ...

  10. 1.7 单层卷积网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.6 三维卷积 回到目录 1.8 简单卷积网络示例 单层卷积网络 (One Layer of a Convolutional Network) 今天我们要讲的是如何构建卷积 ...

最新文章

  1. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)
  2. linux u盘 挂载 type,Linux挂载U盘报错:mount: unknown filesystem type 'ntfs'
  3. VMware HA环境搭建七:WIN2012 ISCSI目标服务器的安装
  4. Python 直接赋值、浅拷贝和深度拷贝区别
  5. NYOJ 16 矩形嵌套
  6. 向量数量积公式_多法 | 向量数量积相关最值问题的常见处理方法
  7. embedding亦福亦祸?XGBoost与LightGBM的新机遇
  8. 用dos复制文件_一文带你熟悉DOS命令操作,CMD从此不再是路人!
  9. OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全
  10. torch.nn与torch.nn.functional
  11. Perl_获得字符串长度_length($var)
  12. 2021年9月计算机二级Office电脑版刷题软件(真题题库)分享
  13. elk日志管理系统搭建
  14. 前端怎么加粗字体_安卓平板要怎么像ipad一样自由制作电子手帐
  15. CSS line-height属性
  16. HID 报告描述符的填充方式
  17. 人工智能和机器学习在医疗领域中的应用
  18. Word文件怎么打印
  19. IT项目管理:讨论 projects、programs、和 portfolio 之间的关系
  20. 方法参数中pass by reference(传引用)和 pass by value(传值)的区别

热门文章

  1. mysql忘记命令后半部分_Mysql 5 易忘的命令
  2. 如何使用_如何使用Excel播放音乐
  3. pandas访问分组里面的数据_实战用pandas+PyQt5制作一款数据分组透视处理工具
  4. python3一个中文3个字符_高手接招! 小应用 用python3判断一个字符串是不是中文组成的...
  5. Comparable和Comparator的区别
  6. ODS(Operational Data Store)定义
  7. JDK的bin目录下各种工具的使用说明_对不起自己,这么久没写博,抱歉
  8. sed与awk命令小结
  9. hdu2019——数列有序解题报告
  10. 【转载】高效能,大数据量存储方案SqlBulkCopy