Carl Rynegardh
Carl Rynegardh

Reputation: 558

CNN - Reshaping output from Conv layer to dense layer

My conv-layer has the output shape of (64,3,3,80) where 64 is the batch size. The next layer is a dense layer of shape (3920,4096). How do I reshape the output of my conv-layer to fit with the shape of my dense layer? I am implementing in tensorflow :) This is the layer just before the dense layer.

    stride_conv = [1,1,1,1] 
    padding='SAME'
    filter_3 = tf.Variable(initial_value=tf.random_normal([3,3,112,80]))
    conv_3 = tf.nn.conv2d(conv_2,filter_3,stride_conv,padding)

Thanks!

Upvotes: 3

Views: 2813

Answers (1)

Harsha Pokkalla
Harsha Pokkalla

Reputation: 1802

conv3 => Reshape => FC1 (720->4096)

[64,3,3,80] => [64,720] => [64,4096]

Following code does the Conv to FC as shown above:

 shape = int(np.prod(conv_3.get_shape()[1:]))
 conv_3_flat = tf.reshape(conv_3, [-1, shape])

 fc1w = tf.Variable(tf.truncated_normal([shape, 4096],dtype=tf.float32,stddev=1e-1), name='weights')
 fc1b = tf.Variable(tf.constant(1.0, shape=[4096], dtype=tf.float32),
                                 trainable=True, name='biases')

 fc1 = tf.nn.bias_add(tf.matmul(conv_3_flat, fc1w), fc1b)
 fc1 = tf.nn.relu(fc1)

Hope this helps.

Also, simple MNIST model (taken from here: https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/convolutional_network.py)

def conv_net(x, weights, biases, dropout):
    # Reshape input picture
    x = tf.reshape(x, shape=[-1, 28, 28, 1])

    # Convolution Layer
    conv1 = conv2d(x, weights['wc1'], biases['bc1'])
    # Max Pooling (down-sampling)
    conv1 = maxpool2d(conv1, k=2)

    # Convolution Layer
    conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])
    # Max Pooling (down-sampling)
    conv2 = maxpool2d(conv2, k=2)

    # Fully connected layer
    # Reshape conv2 output to fit fully connected layer input
    fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]])
    fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])
    fc1 = tf.nn.relu(fc1)
    # Apply Dropout
    fc1 = tf.nn.dropout(fc1, dropout)

    # Output, class prediction
    out = tf.add(tf.matmul(fc1, weights['out']), biases['out'])
    return out

Upvotes: 2

Related Questions