【Tensorflow 大马哈鱼】二维CNN函数、pooling函数、dense函数

在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化。

一、旧版本(1.0以下)的卷积函数:tf.nn.conv2d

conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=None,
    data_format=None,
    name=None
)

示例:
conv1=tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 
h_conv1 = tf.nn.relu(conv1 + b_conv1) 


x为[-1,28,28,1],   W为[5,5,1,32]
则:conv1变为[-1,28,28,32]    
conv1还要加上[32]的偏移变量
最后外面还要使用一个激活函数

该函数定义在tensorflow/python/ops/gen_nn_ops.py。

注意:

1、关于strides步长,一般使用的是[1,1,1,1],如x为[-1,28,28,1],   W为[5,5,1,32],当步长为(1,1)时,变为[-1,28,28,32] 

2、nn.conv2d不包含 偏置量 和 激活函数,需要自己加。

参数:

input: 一个4维Tensor(N,H,W,C). 类型必须是以下几种类型之一: half, float32, float64. 
filter: 卷积核. 类型和input必须相同,4维tensor, [filter_height, filter_width, in_channels, out_channels],如[5,5,3,32] 
strides: 在input上切片采样时,每个方向上的滑窗步长,必须和format指定的维度同阶,如[1, 2, 2, 1] ,一般是使用【1,1,1,1】,中间两个是(1,1)。
padding: 指定边缘填充类型: “SAME”, “VALID”. SAME表示卷积后图片保持不变,VALID则会缩小。 
use_cudnn_on_gpu: 可选项,bool型。表示是否在GPU上用cudnn进行加速,默认为True. 
data_format: 可选项,指定输入数据的格式: “NHWC”或 “NCHW”, 默认为”NHWC”。 
NHWC格式指[batch, in_height, in_width, in_channels] 
NCHW格式指[batch, in_channels, in_height, in_width] 
name: 操作名,可选.

二、tf.nn.max_pool

tf.nn.max_pool(
    value,
    ksize,
    strides,
    padding,
    data_format='NHWC',
    name=None
)

示例:

tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

输入x是:[-1,28,28,32]
输出为: [-1,14,14,32]


三、1.0版本中的卷积函数:tf.layers.conv2d

conv2d(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format='channels_last',
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    trainable=True,
    name=None,
    reuse=None
)

定义在tensorflow/python/layers/convolutional.py

注意:

1,nn.conv2d中的filter为[5,5,3,32]形式,在layers.conv2d中变为filterskernel_sizefilters为32,kernel_size为【5,5】或5.

2,strides步长默认为[1,1],也可以直接设置为一个数,如strides=1 。一般步长都是1.

3,layers.conv2d中包含了偏置项use_bias,默认为Ture

4,  layers.conv2d中包含了激活函数

5,kernel_initializer和bias_initializer是初始化器

参数:多了很多,但实际用起来,却更简单。

inputs: 输入数据,4维tensor. 
filters: 卷积核个数。 
kernel_size:卷积核大小,如【5,5】。如果长宽相等,也可以直接设置为一个数,如kernel_size=5 

strides: 卷积过程中的滑动步长,默认为[1,1]. 也可以直接设置为一个数,如strides=1 。
padding: 边缘填充,’same’ 和’valid‘选其一。默认为valid 
data_format: 输入数据格式,默认为channels_last ,即 (batch, height, width, channels),也可以设置为channels_first 对应 (batch, channels, height, width). 
dilation_rate: 微步长卷积,这个比较复杂一些,请百度. 

activation: 激活函数. 
use_bias: Boolean型,是否使用偏置项. 
kernel_initializer: 卷积核的初始化器. 
bias_initializer: 偏置项的初始化器,默认初始化为0. 
kernel_regularizer: 卷积核化的正则化,可选. 
bias_regularizer: 偏置项的正则化,可选. 
activity_regularizer: 输出的正则化函数. 
trainable: Boolean型,表明该层的参数是否参与训练。如果为真则变量加入到图集合中 GraphKeys.TRAINABLE_VARIABLES (see tf.Variable). 
name: 层的名字. 

reuse: Boolean型, 是否重复使用参数.

示例:

conv1=tf.layers.conv2d(
      inputs=x,
      filters=32,
      kernel_size=5,
      padding="same",
      activation=tf.nn.relu,
      kernel_initializer=tf.TruncatedNormal(stddev=0.01))

#复杂一些的
conv1 = tf.layers.conv2d(batch_images, 
                         filters=64,
                         kernel_size=7,
                         strides=2,
                         activation=tf.nn.relu,
                         kernel_initializer=tf.TruncatedNormal(stddev=0.01)
                         bias_initializer=tf.Constant(0.1),
                         kernel_regularizer=tf.contrib.layers.l2_regularizer(0.003),
                         bias_regularizer=tf.contrib.layers.l2_regularizer(0.003),
                         name='conv1')

四、max_pooling2d层

最大值池化均值池化

1. 最大池化层 tf.layers.max_pooling2d

2. 均值池化    tf.layers.average_pooling2d

tf.layers.max_pooling2d(
    inputs,      #输出
    pool_size,
    strides,
    padding='valid',
    data_format='channels_last',
    name=None
)

inputs: 进行池化的数据。 
pool_size: 池化的核大小(pool_height, pool_width),如[3,3]. 如果长宽相等,也可以直接设置为一个数,如pool_size=3. 
strides: 池化的滑动步长。可以设置为[1,1]这样的两个整数. 也可以直接设置为一个数,如strides=2 
padding: 边缘填充,’same’ 和’valid‘选其一。默认为valid 
data_format: 输入数据格式,默认为channels_last ,即 (batch, height, width, channels),也可以设置为channels_first 对应 (batch, channels, height, width). 
name: 层的名字。

示例:

pool1 = tf.layers.max_pooling2d(
    conv1,
    pool_size=2,
    strides=2,
)  
或pool1=tf.layers.max_pooling2d(inputs=x, pool_size=[2, 2], strides=2)

则:
conv1 为  (b, 28, 28, 16)
则pool1为 (b, 14, 14, 16)

五、全连接层(dense)

全连接层 tf.layers.dense

dense(
    inputs,
    units,
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=tf.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    trainable=True,
    name=None,
    reuse=None
)

注意:

有激活函数,也有偏置量

inputs: 输入数据,2维tensor. 
units: 该层的神经单元结点数。 
activation: 激活函数. 
use_bias: Boolean型,是否使用偏置项. 
kernel_initializer: 卷积核的初始化器. 
bias_initializer: 偏置项的初始化器,默认初始化为0. 
kernel_regularizer: 卷积核化的正则化,可选. 
bias_regularizer: 偏置项的正则化,可选. 
activity_regularizer: 输出的正则化函数. 
trainable: Boolean型,表明该层的参数是否参与训练。如果为真则变量加入到图集合中 GraphKeys.TRAINABLE_VARIABLES (see tf.Variable). 
name: 层的名字. 
reuse: Boolean型, 是否重复使用参数.

全连接层执行操作outputs=activation(inputs.kernel+bias)outputs=activation(inputs.kernel+bias)如果执行结果不想进行激活操作,则设置activation=None
示例:

#全连接层
dense1 = tf.layers.dense(inputs=pool3, units=1024, activation=tf.nn.relu)
dense2= tf.layers.dense(inputs=dense1, units=512, activation=tf.nn.relu)
logits= tf.layers.dense(inputs=dense2, units=10, activation=None)
也可以对全连接层的参数进行正则化约束:
dense1 = tf.layers.dense(inputs=pool3, units=1024, activation=tf.nn.relu, 
            kernel_regularizer=tf.contrib.layers.l2_regularizer(0.003))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值