我有一个使用Tensorflow库编写的CNN代码:
x_img = tf.placeholder(tf.float32)
y_label = tf.placeholder(tf.float32)
def convnet_3d(x_img, W):
conv_3d_layer = tf.nn.conv3d(x_img, W, strides=[1,1,1,1,1], padding='VALID')
return conv_3d_layer
def maxpool_3d(x_img):
maxpool_3d_layer = tf.nn.max_pool3d(x_img, ksize=[1,2,2,2,1], strides=[1,2,2,2,1], padding='VALID')
return maxpool_3d_layer
def convolutional_neural_network(x_img):
weights = {'W_conv1_layer':tf.Variable(tf.random_normal([3,3,3,1,32])),
'W_conv2_layer':tf.Variable(tf.random_normal([3,3,3,32,64])),
'W_fc_layer':tf.Variable(tf.random_normal([409600,1024])),
'W_out_layer':tf.Variable(tf.random_normal([1024, num_classes]))}
biases = {'b_conv1_layer':tf.Variable(tf.random_normal([32])),
'b_conv2_layer':tf.Variable(tf.random_normal([64])),
'b_fc_layer':tf.Variable(tf.random_normal([1024])),
'b_out_layer':tf.Variable(tf.random_normal([num_classes]))}
x_img = tf.reshape(x_img, shape=[-1, img_x, img_y, img_z, 1])
conv1_layer = tf.nn.relu(convnet_3d(x_img, weights['W_conv1_layer']) + biases['b_conv1_layer'])
conv1_layer = maxpool_3d(conv1_layer)
conv2_layer = tf.nn.relu(convnet_3d(conv1_layer, weights['W_conv2_layer']) + biases['b_conv2_layer'])
conv2_layer = maxpool_3d(conv2_layer)
fc_layer = tf.reshape(conv2_layer,[-1, 409600])
fc_layer = tf.nn.relu(tf.matmul(fc_layer, weights['W_fc_layer'])+biases['b_fc_layer'])
fc_layer = tf.nn.dropout(fc_layer, keep_rate)
output_layer = tf.matmul(fc_layer, weights['W_out_layer'])+biases['b_out_layer']
return output_layer
我的输入图片x_img是25x25x25(3d图片),我对代码有一些疑问:
1-'W_conv1_layer'中的[3,3,3,1,32]表示[宽度x高度x深度x通道x过滤器数量]?
2-在“ W_conv2_layer”中的权重为[3,3,3,32,64],为什么输出为64?我知道3x3x3是过滤器大小,而32是从第一层输入的。
“ W_fc_layer”权重中的3-是[409600,1024],1024是FC层中的节点数,但是这个神奇的数字“ 409600”来自哪里?
4-在图像进入转换层之前,为什么我们需要重塑图像
x_img = tf.reshape(x_img, shape=[-1, img_x, img_y, img_z, 1])
答案 0 :(得分:1)
所有答案都可以在official doc of conv3d中找到。
权重应为[filter_depth,filter_height,filter_width,in_channels,out_channels]
选择数字32和64是因为它们很简单,它们只是超参数
409600来自重塑maxpool3d的输出(可能是一个错误,实际大小应为4096,请参见注释)
因为张量流期望其输入为某些布局
您应该先尝试在图像上实现简单的卷积网络,然后再转移到更复杂的内容。