首页 > 其他 > 详细

TensorFlow2.0学习---卷积神经网络

时间:2020-03-26 20:49:14      阅读:90      评论:0      收藏:0      [点我收藏+]

来自书籍:TensorFlow深度学习

一、卷积神经网络

技术分享图片

1、卷积

单通道输入、单卷积核:

技术分享图片

 

多通道输入、单卷积核:

技术分享图片    技术分享图片

 

 

 多通道输入、多卷积核

技术分享图片

 

 

2、步长

技术分享图片

技术分享图片

 

 

 技术分享图片

技术分享图片

 

 

3、填充

same:如步长=2卷积核扫描结束后还剩 1 个元素,不够卷积核扫描了,这个时候就在后面补 1 个零,补完后满足卷积核的扫描,这种方式就是same。

valid:如果说把刚才不足以扫描的元素位置抛弃掉,就是valid方式。

 

 技术分享图片

技术分享图片

4、感知野计算

技术分享图片

技术分享图片

 

 

4、卷积层实现

(1)自定义卷积核权值

x = tf.random.normal([2,5,5,3]) # 模拟输入,3通道,高宽为5
# 需要根据[k,k,cin,cout]格式创建W张量,4 个3x3大小卷积核
w = tf.random.normal([3,3,3,4])
# 步长为1, padding为0, 格式padding=[[0,0],[上,下],[左,右],[0,0]]
out = tf.nn.conv2d(x,w,strides=1,padding=[[0,0],[1,1],[1,1],[0,0]])

##设置 padding = ‘same’,strides=1可以直接得到输入与输出同大小的卷积层
#输入x大小 [2,5,5,3] , 输出 out 大小[2, 5, 5, 4]
out = tf.nn.conv2d(x,w,strides=1,padding=SAME)


#当strides > 1时,padding = ‘same’,则输出高和宽成1/s倍减少。
#输入x大小 [2,5,5,3] , 输出 out 大小[2, 2, 2, 4],因为(5+1)/3 = 2
out = tf.nn.conv2d(x,w,strides=3,padding=SAME) 

 

(2)卷积层类

layers.Conv2D :在新建卷积层类时,只需要指定卷积核数量参数filters,卷积核大小kernel_size,步长 strides,填充padding 等即可。

#创建4个3×3大小的卷积核的卷积层,步长为1,padding=“same”:
layer = layers.Conv2D(4,kernel_size=3,strides=1,padding=SAME) 

#创建4 个3 × 4 大小的卷积核,竖直方向移 动步长??? = 2,水平方向移动步长???? =1
layer = layers.Conv2D(4,kernel_size=(3,4),strides=(2,1),padding=SAME) 

 

5、池化层

 技术分享图片

6、BatchNorm层

(1)前向传播:

 技术分享图片

按照:

技术分享图片

 

 

 迭代更新全局训练数据的统计值????和????2,其中momentum 是需要设置一个超参数,用于平衡两者更新幅度。默认为0.99

技术分享图片

 

 

 (2)反向更新

  • Batch Norm:统计每个通道上所有其他维度的均值和方差。

技术分享图片

技术分享图片

 

Batch Norm:

技术分享图片

 

 

 (3)BN实现

layers.BatchNormalization():需设置training标志位来区分训练阶段和测试阶段

LetNet-5 网络模型:

network = Sequential([ # 网络容器 
    layers.Conv2D(6,kernel_size=3,strides=1),
    # 插入BN层
    layers.BatchNormalization(), 
    layers.MaxPooling2D(pool_size=2,strides=2),
    layers.ReLU(),
    layers.Conv2D(16,kernel_size=3,strides=1),
    # 插入BN层
    layers.BatchNormalization(), 
    layers.MaxPooling2D(pool_size=2,strides=2),
    layers.ReLU(),
    layers.Flatten(),
    layers.Dense(120, activation=relu),
    # 此处也可以插入BN层
    layers.Dense(84, activation=relu),
    # 此处也可以插入BN层
    layers.Dense(10)
                    ])

训练阶段:

with tf.GradientTape() as tape:
    # 插入通道维度
    x = tf.expand_dims(x,axis=3)
    # 前向计算,设置计算模式,[b, 784] => [b, 10]
    out = network(x, training=True)

测试阶段:

for x,y in db_test: # 遍历测试集
    # 插入通道维度
    x = tf.expand_dims(x,axis=3)
    # 前向计算,测试模式
    out = network(x, training=False)

 

TensorFlow2.0学习---卷积神经网络

原文:https://www.cnblogs.com/Lee-yl/p/12575652.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!