Tensorflow 不同卷积层的计算方法

卷积神经网络的研究产生了各种各样的网络模型,也提出了多个卷积层的变种,本文主要介绍卷积层的算法及在Tensorflow中的实现方法,包括:普通卷积,空洞卷积,转置卷积,分离卷积。

1. 普通卷积

以多通道输入,单卷积核(步长为1,不填充)为例说明

import tensorflow as tf 
r = tf.constant([[1.,-1.,0.,2.,0],[-1.,-2.,2.,3.,1],[1.,2.,-2.,1.,0],[0.,-1.,-1.,-3.,2],[2.,0.,0.,1.,-1]])
r = tf.expand_dims(r,axis=0)
r = tf.expand_dims(r,axis=3)
print(r.shape)'''(1, 5, 5, 1)'''
wr = tf.constant([[-1., 1, 2], [1., -1, 3], [0., -1, -2]])
wr = tf.expand_dims(wr,axis=2)
wr = tf.expand_dims(wr,axis=3)
print(wr.shape)'''(3, 3, 1, 1)'''
layer = tf.nn.conv2d(r,wr,strides=1,padding='VALID')
print(layer)
'''
tf.Tensor(
[[[[  7.]
   [ 10.]
   [  3.]]

  [[ -1.]
   [ 24.]
   [ -1.]]

  [[ -5.]
   [-13.]
   [ 12.]]]], shape=(1, 3, 3, 1), dtype=float32)'''
import tensorflow as tf 
x = tf.random.normal([2,5,5,3])
layer = tf.keras.layers.Conv2D(4,kernel_size=3,strides=1,padding='SAME')
out = layer(x)
'''
out.shape([2,5,5,4])'''

2. 空洞卷积(Dilated/Atrous Convolution)

空洞卷积在普通卷积上增加了一个dilation rate参数,用来控制感受野区域的采用步长,如下图所示。dilation rate=1时,空洞卷积退化为普通卷积。

以上面为例,dilation rate=2,实现空洞卷积

import tensorflow as tf 
r = tf.constant([[1.,-1.,0.,2.,0],[-1.,-2.,2.,3.,1],[1.,2.,-2.,1.,0],[0.,-1.,-1.,-3.,2],[2.,0.,0.,1.,-1]])
r = tf.expand_dims(r,axis=0)
r = tf.expand_dims(r,axis=3)
print(r.shape)
wr = tf.constant([[-1., 1, 2], [1., -1, 3], [0., -1, -2]])
wr = tf.expand_dims(wr,axis=2)
wr = tf.expand_dims(wr,axis=3)
print(wr.shape)
layer = tf.nn.conv2d(r,wr,strides=1,padding='VALID',dilations=2)
print(layer)
'''tf.Tensor([[[[4.]]]], shape=(1, 1, 1, 1), dtype=float32)'''
import tensorflow as tf 
x = tf.random.normal([2,5,5,3])
layer = tf.keras.layers.Conv2D(4,kernel_size=3,strides=1,padding='VALID',dilation_rate=2)
out = layer(x)
print(out)
'''tf.Tensor(
[[[[-2.0044637  -0.28247043 -0.06761412  0.24804944]]]


 [[[-0.5734864   1.5184563   0.6989046  -1.6083945 ]]]], shape=(2, 1, 1, 4), dtype=float32)'''

 3. 转置卷积

转置卷积并不是普通卷积的逆过程,但是二者之间有一定的联系,同时转置卷积也是基于普通卷积实现的。在相同的设定下,输入 经过普通卷积运算后得到𝒐 = 𝐶𝑜𝑛𝑣( ),我们将𝒐送入转置卷积运算后,得到 = 𝐶𝑜𝑛𝑣𝑇𝑟𝑎𝑛𝑠𝑝𝑜𝑠𝑒(𝒐),其中 ≠ ,但是 与 形状相同。

输入为5×5,步长为2

矩阵角度出发,转置卷积的转置是指卷积核矩阵W 产生的稀疏矩阵W′在计算过程中需要先转置W′T, 

卷积核矩阵W转换为稀疏矩阵W'的过程为

通过一次矩阵相乘实现普通卷积计算:O' = W'@X'

转置卷积运算:X' = W' T@O'

import tensorflow as tf 
# 创建5x5 大小的输入
x = tf.range(25)+1
x = tf.reshape(x, [1,5,5,1])
x = tf.cast(x, tf.float32)

# 创建3×3卷积核
w = tf.constant([[-1,2,-3.],[4,-5,6],[-7,8,-9]])
w = tf.expand_dims(w,axis=2)
w = tf.expand_dims(w,axis=3)

# 普通卷积运算
out = tf.nn.conv2d(x,w,strides=2,padding='VALID')
'''
tf.Tensor(
[[[[ -67.]
   [ -77.]]

  [[-117.]
   [-127.]]]], shape=(1, 2, 2, 1), dtype=float32)'''

# 转置卷积运算
xT = tf.nn.conv2d_transpose(out,w,strides=2,padding='VALID',output_shape=[1,5,5,1])
'''
tf.Tensor(
[[[[   67.]
   [ -134.]
   [  278.]
   [ -154.]
   [  231.]]

  [[ -268.]
   [  335.]
   [ -710.]
   [  385.]
   [ -462.]]

  [[  586.]
   [ -770.]
   [ 1620.]
   [ -870.]
   [ 1074.]]

  [[ -468.]
   [  585.]
   [-1210.]
   [  635.]
   [ -762.]]

  [[  819.]
   [ -936.]
   [ 1942.]
   [-1016.]
   [ 1143.]]]], shape=(1, 5, 5, 1), dtype=float32)'''

4. 分离卷积

普通卷积的参数量是
3 ∗ 3 ∗ 3 ∗ 4= 108
分离卷积的第一部分参数量
3 ∗ 3 ∗ 3 ∗ 1= 27
第二部分参数量
1∗ 1∗ 3 ∗4 = 12
分离卷积的总参数量只有39,但是却能实现普通卷积同样的输入输出尺寸

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Gabor卷层是一种常用的卷神经网络层,用于提取图像中的纹理特征。下面是一个使用Python和TensorFlow实现Gabor卷层的示例代码: ```python import tensorflow as tf from tensorflow.keras import layers class GaborConv2D(layers.Layer): def __init__(self, num_filters, kernel_size, strides=1, padding='valid'): super(GaborConv2D, self).__init__() self.num_filters = num_filters self.kernel_size = kernel_size self.strides = strides self.padding = padding def build(self, input_shape): self.filters = self.add_weight(name='filters', shape=(self.kernel_size, self.kernel_size, input_shape[-1], self.num_filters), initializer='random_normal', trainable=True) def call(self, inputs): outputs = tf.nn.conv2d(inputs, self.filters, strides=[1, self.strides, self.strides, 1], padding=self.padding) return outputs # 创建一个Gabor卷层实例 gabor_conv = GaborConv2D(num_filters=32, kernel_size=3, strides=1, padding='same') # 输入数据 input_data = tf.random.normal(shape=(1, 28, 28, 3)) # 前向传播 output_data = gabor_conv(input_data) # 打印输出数据的形状 print(output_data.shape) ``` 这段代码定义了一个名为`GaborConv2D`的自定义卷层类,它继承自TensorFlow的`layers.Layer`类。在`GaborConv2D`类中,我们定义了卷层的参数和计算过程。在`build`方法中,我们创建了卷核的权重,并使用随机正态分布进行初始化。在`call`方法中,我们使用TensorFlow的`tf.nn.conv2d`函数进行卷计算。 以上代码演示了如何创建一个Gabor卷层实例,并对输入数据进行前向传播计算。你可以根据自己的需求调整卷层的参数,例如卷核数量、卷核大小、步长和填充方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪易

给我来点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值