3D CNN参数计算

时间:2018-08-10 14:13:31

标签: python-3.x tensorflow

我有一个使用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])

1 个答案:

答案 0 :(得分:1)

所有答案都可以在official doc of conv3d中找到。

  1. 权重应为[filter_depth,filter_height,filter_width,in_channels,out_channels]

  2. 选择数字32和64是因为它们很简单,它们只是超参数

  3. 409600来自重塑maxpool3d的输出(可能是一个错误,实际大小应为4096,请参见注释)

  4. 因为张量流期望其输入为某些布局

您应该先尝试在图像上实现简单的卷积网络,然后再转移到更复杂的内容。