tf中的卷积神经网络

tf中的卷积神经网络

1. 卷积

  • 对于全连层,有参数过多,加重硬件负担的风险。采用部分连接的方法,如下图所示(其中绿线的权值相同。蓝线的权值相同)可以有效降低参数。对于局部连接可以理解为一组权值(在读完一组图片前权值不变)滑过整张图片,得出新的信息。
    在这里插入图片描述
  • 卷积的概念:卷积的概念如下,两个矩形门函数的卷积是三角函数(详见信号与系统) y ( t ) = x ( t ) ∗ y ( t ) = ∫ − ∞ + ∞ x ( τ ) y ( t − τ ) d τ y(t)=x(t)\ast y(t)=\int_{-\infty}^{+\infty}x(\tau)y(t-\tau)\rm d\tau y(t)=x(t)y(t)=+x(τ)y(tτ)dτ
  • 2D-卷积(离散):可以将kernel(即参数w)看为连续卷积中的 h ( τ ) h(\tau) h(τ),将与kernel同维度的部分input看为连续卷积中的 x ( τ ) x(\tau) x(τ),将输出的一个点看为连续卷积中的输出结果。
    在这里插入图片描述
  • 2D-卷积计算方法:将kernel中的值与窗口对应部分input中的值按位置对应相乘,再累加,再统一加bias。

2. 卷积神经网络

  • 对于多个通道的数据,要加入与通道数相同的kernel(这多个kernel仍称为一个卷积核),这多个kernel与对应通道input(对应窗口)相乘累加后的值再累加得到输出值
  • padding:有时候当窗口快滑倒边界时,会出现再滑动的话出现边界溢出的问题,这导致最后的输出可能在某个维度上略小于输入。因此采用padding操作在图片的(矩阵数值的边界)边界上添加一些数值,使窗口可以继续滑动,保证了输入输出的维度一致
  • stride:默认窗口每次间隔一个单位滑动,stride可以设置滑动的步长,这样也可以下降输出的维度大小
  • 多个卷积核:无论数据是几维的,在经过一个卷积核输出都是一个二维值,这对于深度学习的后续进行是不利的,因此采用多个卷积核来扩充输出的维度。如一个[1,32,32,3]的图片数据经过[4,3,5,5]的卷积操作(4个3通道5X5的卷积核)得到输出为[1,32,32,4]的数据
    在这里插入图片描述
  • tf中的2D卷积操作:layers.Conv2D(自动管理维护w和b参数)
import tensorflow as tf
from tensorflow.keras import layers
# 其中第一个数字指卷积核个数,vaild指不做padding,same指做padding
layer = layers.Conv2D(4, kernel_size=5, strides=1, padding='vaild')
out = layer(x)
print(out)
layer = layers.Conv2D(4, kernel_size=5, strides=1, padding='same')
out = layer(x)
print(out)
layer = layers.Conv2D(4, kernel_size=5, strides=2, padding='same')
out = layer(x)
print(out)
  • tf中的2D卷积操作:nn.Conv2D(需要自己管理维护w和b参数,更灵活)
w = tf.random.normal([5,5,3,4])
b = tf.zeros([4])
out = tf.nn.conv2d(x, w, strides=1, padding='VALID')
out = out + b
print(out)
out = tf.nn.conv2d(x, w, strides=2, padding='VALID')
out = out + b
print(out)
  • tf中卷积的梯度下降:以输入为3X3矩阵,卷积核为2X2,输出为2X2为例 O 00 = x 00 ∗ w 00 + x 01 ∗ w 01 + x 10 ∗ w 10 + x 11 ∗ w 11 + b O_{00}=x_{00}*w_{00}+x_{01}*w_{01}+x_{10}*w_{10}+x_{11}*w_{11}+b O00=x00w00+x01w01+x10w10+x11w11+b O 01 = x 01 ∗ w 00 + x 02 ∗ w 01 + x 11 ∗ w 10 + x 12 ∗ w 11 + b O_{01}=x_{01}*w_{00}+x_{02}*w_{01}+x_{11}*w_{10}+x_{12}*w_{11}+b O01=x01w00+x02w01+x11w10+x12w11+b O 10 = x 10 ∗ w 00 + x 11 ∗ w 01 + x 20 ∗ w 10 + x 21 ∗ w 11 + b O_{10}=x_{10}*w_{00}+x_{11}*w_{01}+x_{20}*w_{10}+x_{21}*w_{11}+b O10=x10w00+x11w01+x20w10+x21w11+b O 11 = x 11 ∗ w 00 + x 12 ∗ w 01 + x 21 ∗ w 10 + x 22 ∗ w 11 + b O_{11}=x_{11}*w_{00}+x_{12}*w_{01}+x_{21}*w_{10}+x_{22}*w_{11}+b O11=x11w00+x12w01+x21w10+x22w11+b ∂ L o s s ∂ w 00 = ∑ i ∈ 00 , 01 , 10 , 11 ∂ L o s s ∂ O i ∂ O i ∂ w i \frac{\partial Loss}{\partial w_{00}} =\sum_{i\in 00,01,10,11}\frac{\partial Loss}{\partial O_i}\frac{\partial O_i}{\partial w_i} w00Loss=i00,01,10,11OiLosswiOi其中 ∂ O 00 ∂ w 00 = x 00 \frac{\partial O_{00}}{\partial w_{00}}=x_{00} w00O00=x00

3. 池化和采样

  • 池化(下采样):降低维度,池化主要分为两种,即最大值池化和平均池化。其中最大值池化是取窗内最大值最为一个窗内数据的代表,平均池化取窗内平均值最为一个窗内数据的代表
# 第一种方法
pool = layers.MaxPool2D(2, strides=2) #其中2代表池化的kernel大小
out = pool(x)
print(out)
pool = layers.MaxPool2D(3, strides=1)
out = pool(x)
print(out)
# 第二种方法
out = tf.nn.maxPool2d(x, strides=2, padding='VALID')
  • 上采样:增加维度,如复制等
    在这里插入图片描述
layer = layers.UpSampling2D(size = 3) #size代表增大的倍数
out = layer(x)
print(out)
  • ReLU:用于去除负的单元(如像素或特征)值
x=tf.random.normal([2, 3])
# 第一种方法
tf.nn.relu(x)
print(x)
# 第二种方法
layers.ReLU()(x)
print(x)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值