Reputation: 558
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
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