Press "Enter" to skip to content

CNN(卷积神经网路)的操作?

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

Tensorflow版本的Convolution1D vs Convolution2D 说明

 

tensorflow中的conv1d和conv2d的区别:conv1d是单通道的,conv2d是多通道,所以conv1d适合处理文本序列,conv2d适合处理图像。

 

conv1d

 

import tensorflow as tf
input = tf.Variable(tf.random_normal([1, 5, 20]))
params1 = {“inputs”: input, “filters”: 2048, “kernel_size”: 2,”strides”:1,”activation”: tf.nn.relu, “use_bias”: True,”padding”:’SAME’}
op01 = tf.layers.conv1d(**params1)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print(sess.run(tf.shape(op01)))
>>>[1,5,2048]

 

 

    1. 输入input第一维为batch_size,此处为1,即只有一个文本,第二维和第三维分别表示输入的长和宽,在文本中就是 word_embedding矩阵

 

    1. ,句子长度为5,embedding维度为20。

 

    1. 在文本中,卷积的某一维大小往往为embedding长度,即在宽度上不需要窗口移动,宽度就是整个窗口。所以 conv1d默认卷积的宽度就为embedding维度

 

    1. ,长度是通过kernel_size来指定的,此处为2,即卷积核的大小为2*embedding_size(将此想像成一般图片任务CNN的patching大小,只是宽度已固定,故只需指定kernal_size(即一个文本的序列长度中,一次要多少长度去做convolution(ps:宽士embedding大小))。

 

    1. strides为步长,此处为1,即卷积核每隔一个单词移动一次。

 

    1. filters是卷积核的个数,即输出的维度。

 

    1. padding有valid和same两种选择,valid在长度方向(宽度方向不padding)不进行padding,而same则在长度方向进行padding,保证输入句子长度和卷积后输出的句子长度一致,此处为5 。

 

 

conv2d

 

input = tf.Variable(tf.random_normal([1, 28, 28, 1]))
filter = tf.Variable(tf.random_normal([3, 3, 1, 32]))
op1 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding=’SAME’)

 

 

    1. input输入是1张28*28大小的图片,图像channel数是1(batch,长,宽,输入通道数)有时batch会设-1(即不指定)

 

    1. filter卷积核是3*3,数量是1(长,宽,输入通道数,输出通道数(卷积核个数))[height, width, channel, out_size]

     

      1. strides步长是[1,1,1,1],第一维和最后一维保持1不变,第二维和第三维分别为长度方向和宽度方向的步长。

     

      1. 1张图最后输出的op1就是一个shape为[1,28,28,32]的张量,即得到一个3*3的feature map(batch,长,宽,输出通道数)

     

     

    Reference: https://blog.csdn.net/bobobe/article/details/87923618

     

    # define placeholder for inputs to network
    xs = tf.placeholder(tf.float32, [None, 784]) # 28x28
    ys = tf.placeholder(tf.float32, [None, 10])
    keep_prob = tf.placeholder(tf.float32)
    x_image = tf.reshape(xs, [-1, 28, 28, 1])
    # print(x_image.shape) # [n_samples, width, height, channel]说明:
    ,我们定义输入图xs大小为784(28*28),ys为预测目标0~9,所以大小为10,
    x_image 为 xs reshape后的结果tf.reshape:
    Given tensor, this operation returns a tensor that has the same values as tensor with shape shape## conv1 layer ### W_conv1:patch 5x5, in size 1, out size 32
    W_conv1 = weight_variable([5, 5, 1, 32]) 
    b_conv1 = bias_variable([32])说明:
    在此,我们定义W_conv1大小为[5, 5, 1, 32]=>[卷积核长,卷积核宽,通道,out_size]而out_size为自定义,其中5,5视为patch 5x5,在图片cnn任务中即为filter大小,然后b_conv1为32是因为w的out_size是32,以32个w要配上b。### ps start ###
    # conv2d => tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    # max_pool_2x2 => tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
    ### ps end #### h_conv1 output size 28x28x32
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
    # h_pool1 output size 14x14x32
    h_pool1 = max_pool_2x2(h_conv1)说明:
    在此,我们定义h_conv1为conv2d(x_image, W_conv1)+b_conv1,
    strides=[1, 1, 1, 1]的第2及第3个值为移动长和宽,在此都为1,padding使用SAME,表示输出大小会与输入大小一致(所以图片大小仍为28*28),故大小为28*28*32,h_pool1及对h_conv进行pooling(池化),在此大小为2*2,故输出会变成14*14*32## conv2 layer ##
    # patch 5x5, in size 32, out size 64
    W_conv2 = weight_variable([5, 5, 32, 64]) 
    b_conv2 = bias_variable([64])
    # h_conv2 output size 14x14x64
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    # h_pool2 output size 7x7x64
    h_pool2 = max_pool_2x2(h_conv2)说明:
    在此,我们定义W_conv2大小[5, 5, 25, 50]=>[卷积核长,卷积核宽,通道,out_size]而out_size为自定义,其中5,5视为patch 5x5,通道为32是因为h_conv2要做卷积2d时conv2d(h_pool1, W_conv2),在此h_pool1的第三维大小是32,故W_conv2通道为32。
    h_pool2部分则是h_conv2经过pooling,故输出为7*7*64## fc1 layer ##
    W_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])说明:
    在此,W_fc1为全连接层,故输入大小是h_conv2大小7*7*64,而输出我们希望为1024个神经节点(neural_nodes),自订义大小为1024。# [n_samples, 7, 7, 64] ->> [n_samples, 7*7*64]
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)说明:
    h_pool2_flat为tf.reshape()将h_pool2的输出值从一个三维的变为一维的数据, -1表示先不考虑输入图片例子维度,将上一个输出结果展平。## fc2 layer ##
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注