tensorflow 卷积函数,tf.conv2d理解.

 函数原型:

tf.nn.conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=True, 
    data_format='NHWC',
    dilations=[1, 1, 1, 1],
    name=None,
)

前面的 input(原始图形4维),filter(卷积核4维),strides(滑动步长 4维),padding 注释如下.

#卷积层
def conv2d(x,W):
    #x input tensor of shape `[batch, in_height, in_width, in_channels]`
    #W filter / kernel tensor of shape [filter_height, filter_width, in_channels, out_channels]
    #`strides[0] = strides[3] = 1`. strides[1]代表x方向的步长,strides[2]代表y方向的步长
    #padding: A `string` from: `"SAME", "VALID"`

    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')

 

卷积知识补充:

在卷积神经网络中有一个重要的概念:深度

卷积层

卷积:在原始的输入上进行特征的提取。特征提取简言之就是,在原始输入上一个小区域一个小区域进行特征的提取,稍后细致讲解卷积的计算过程。

上图中,左方块是输入层,尺寸为32*32的3通道图像。右边的小方块是filter,尺寸为5*5,深度为3。将输入层划分为多个区域,用filter这个固定尺寸的助手,在输入层做运算,最终得到一个深度为1的特征图。

上图中,展示出一般使用多个filter分别进行卷积,最终得到多个特征图。

上图使用了6个filter分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果。

==========================================================================

实例:

基于mnist数据集测试,图形化查看卷积运算结果.

import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
# 读入数据
mnist = input_data.read_data_sets("../../MNIST_data/", one_hot=True)

#定义一个卷积运算的函数
def conv2d(x,W):
    return tf.nn.conv2d(x,W,[1,1,1,1],"SAME")

#定义一个初始化shape 变量的函数
def shape_var(shape):
    # 
    tmp_w = tf.truncated_normal(shape,stddev=0.1)
    return tf.Variable(tmp_w)


#查看原始图片
img = mnist.train.images[1]
# 把从mnist数据集中取出的图形转为 2维图形
img2 = img.reshape([28,28])
plt.imshow(img2)

#卷积运算
#转出 conv2d 函数需要的 shape 型 变量.
# 这里img 只有一张图片,所以最终shape为[1,28,28,1],28x28的1通道图片
img_conv = tf.reshape(img,[-1,28,28,1])

# 定义卷积核,3x3 单通道输入,32通道输出. 可以认为有32个卷积核.每个卷积核为 3x3 矩阵.
w = shape_var([3,3,1,32])

#卷积运算,步长为1 
timg3 = tf.nn.conv2d(img_conv,w,[1,1,1,1],"SAME")

#运行
sess.run(tf.global_variables_initializer())
img3 = sess.run(timg3)

#查看每个通道输出的图形,这里只看前10个.
for i in range(10): #可以到 32
    print(i)
    # 取出第几维数据
    img3_1 = img3[:,:,:,i]
    img3_11 = img3_1.reshape([28,28])
    #print(img3_1.shape)
    plt.imshow(img3_11)
    plt.show()

 

输出原始图片:

 :

 

卷积后图片: 可以看到不同的特征

0

1

2

3

4

5

6

7

8

9

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`slim.conv2d`是TensorFlow中Slim框架中的卷积函数,而`tensorflow.keras.layers.conv2d`是TensorFlow中Keras框架中的卷积函数。 两者所提供的功能都是实现2D卷积层,但是使用方式和参数设置不同: `slim.conv2d`: ```python slim.conv2d(inputs, num_outputs, kernel_size, stride=1, padding='SAME', activation_fn=tf.nn.relu, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.1), biases_initializer=tf.zeros_initializer(), scope=None) ``` 其中各参数含义为: - `inputs`:输入的tensor - `num_outputs`:卷积核的数量,也就是输出的通道数 - `kernel_size`:卷积核大小 - `stride`:卷积核滑动步长,默认为1 - `padding`:卷积层补零的方式,可以设置为`SAME`或者`VALID` - `activation_fn`:激活函数,默认为ReLu - `normalizer_fn`:正则化函数,如BN层 - `weights_initializer`:权重初始化函数 - `biases_initializer`:偏置初始化函数 - `scope`:变量作用域 `tensorflow.keras.layers.conv2d`: ```python tf.keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs) ``` 其中各参数含义为: - `filters`:输出的通道数 - `kernel_size`:卷积核的大小 - `strides`:卷积核滑动步长,默认为(1,1) - `padding`:卷积层补零方式,默认为`valid` - `activation`:激活函数,默认为`None` - `use_bias`:是否使用偏置 - `kernel_initializer`:权重初始化函数 - `bias_initializer`:偏置初始化函数 - `kernel_regularizer`:权重正则化函数 - `bias_regularizer`:偏置正则化函数 - `activity_regularizer`:输出正则化函数 - `kernel_constraint`:权重约束函数 - `bias_constraint`:偏置约束函数 总的来说,`tensorflow.keras.layers.conv2d`提供了更多的参数设置选项,控制更加细致,但对于简单的应用场景,`slim.conv2d`更简单方便。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值