本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.
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]
-
- 输入input第一维为batch_size,此处为1,即只有一个文本,第二维和第三维分别表示输入的长和宽,在文本中就是 word_embedding矩阵
-
- ,句子长度为5,embedding维度为20。
-
- 在文本中,卷积的某一维大小往往为embedding长度,即在宽度上不需要窗口移动,宽度就是整个窗口。所以 conv1d默认卷积的宽度就为embedding维度
-
- ,长度是通过kernel_size来指定的,此处为2,即卷积核的大小为2*embedding_size(将此想像成一般图片任务CNN的patching大小,只是宽度已固定,故只需指定kernal_size(即一个文本的序列长度中,一次要多少长度去做convolution(ps:宽士embedding大小))。
-
- strides为步长,此处为1,即卷积核每隔一个单词移动一次。
-
- filters是卷积核的个数,即输出的维度。
-
- 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’)
-
- input输入是1张28*28大小的图片,图像channel数是1(batch,长,宽,输入通道数)有时batch会设-1(即不指定)
-
- filter卷积核是3*3大小,数量是1(长,宽,输入通道数,输出通道数(卷积核个数))[height, width, channel, out_size]
-
- strides步长是[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