深度学习之卷积神经网络(3)卷积层实现
深度学习之卷积神经网络(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 池化层 1.1 MaxPooling2D 1.2 MaxPooling1D: 1.3 AveragePooling2 ...
- 【深度学习】深入浅出神经网络框架的模型元件(常用层和卷积层)
[深度学习]深入浅出神经网络框架的模型元件(常用层和卷积层) 文章目录 1 常用层1.1 Dense1.2 Activation层1.3 Dropout1.4 Flatten 2 卷积层2.1 Cov ...
- 花书+吴恩达深度学习(十二)卷积神经网络 CNN 之全连接层
目录 0. 前言 1. 全连接层(fully connected layer) 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 CNN ...
- 卷积神经网络之卷积计算、作用与思想 深度学习
博客:blog.shinelee.me | 博客园 | CSDN 卷积运算与相关运算 在计算机视觉领域,卷积核.滤波器通常为较小尺寸的矩阵,比如3×33×3.从这个角度看,多层卷积是在进行逐层映射,整 ...
- 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战 卷积神经网络,听起来像是计算机科学.生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力 ...
- 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(一)
[深度学习]基于Pytorch的卷积神经网络API妙用(一) 文章目录 1 不变性 2 卷积的数学分析 3 通道 4 互相关运算 5 图像中目标的边缘检测 6 基于Pytorch的卷积核 7 特征映射 ...
- 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)
[深度学习]基于Pytorch的卷积神经网络API妙用(二) 文章目录1 Padding和Stride 2 多输入多输出Channel 3 1*1 Conv(笔者在看教程时,理解为降维和升维) 4 池 ...
- 4.7 CNN 特征可视化-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 4.6 什么是神经风格转换? 回到目录 4.8 代价函数 CNN 特征可视化 (What are deep ConvNets learning?) 深度卷积网络到底在学什么? ...
- 1.7 单层卷积网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 1.6 三维卷积 回到目录 1.8 简单卷积网络示例 单层卷积网络 (One Layer of a Convolutional Network) 今天我们要讲的是如何构建卷积 ...
最新文章
- 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)
- linux u盘 挂载 type,Linux挂载U盘报错:mount: unknown filesystem type 'ntfs'
- VMware HA环境搭建七:WIN2012 ISCSI目标服务器的安装
- Python 直接赋值、浅拷贝和深度拷贝区别
- NYOJ 16 矩形嵌套
- 向量数量积公式_多法 | 向量数量积相关最值问题的常见处理方法
- embedding亦福亦祸?XGBoost与LightGBM的新机遇
- 用dos复制文件_一文带你熟悉DOS命令操作,CMD从此不再是路人!
- OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全
- torch.nn与torch.nn.functional
- Perl_获得字符串长度_length($var)
- 2021年9月计算机二级Office电脑版刷题软件(真题题库)分享
- elk日志管理系统搭建
- 前端怎么加粗字体_安卓平板要怎么像ipad一样自由制作电子手帐
- CSS line-height属性
- HID 报告描述符的填充方式
- 人工智能和机器学习在医疗领域中的应用
- Word文件怎么打印
- IT项目管理:讨论 projects、programs、和 portfolio 之间的关系
- 方法参数中pass by reference(传引用)和 pass by value(传值)的区别
热门文章
- mysql忘记命令后半部分_Mysql 5 易忘的命令
- 如何使用_如何使用Excel播放音乐
- pandas访问分组里面的数据_实战用pandas+PyQt5制作一款数据分组透视处理工具
- python3一个中文3个字符_高手接招! 小应用 用python3判断一个字符串是不是中文组成的...
- Comparable和Comparator的区别
- ODS(Operational Data Store)定义
- JDK的bin目录下各种工具的使用说明_对不起自己,这么久没写博,抱歉
- sed与awk命令小结
- hdu2019——数列有序解题报告
- 【转载】高效能,大数据量存储方案SqlBulkCopy