Reputation: 1920
I have a CNN
model for image classification
which I have trained over my dataset. The model goes something like this
Convolution
Relu
pooling
Convolution
Relu
Convolution
Relu
pooling
flat
fully connected (FC1)
Relu
fully connected (FC2)
softmax
After training, I want to get the feature vectors for an image that I input to the pre-trained model i.e. I want to get the output of FC1
layer. Is there any way we can get it, I browsed the web but couldn't find anything useful any suggestions would be of great help guys.
Training script
# input
x = tf.placeholder(tf.float32, shape=[None, img_size_h, img_size_w, num_channels], name='x')
# lables
y_true = tf.placeholder(tf.float32, shape=[None, num_classes], name='y_true')
y_true_cls = tf.argmax(y_true, axis=1)
y_pred = build_model(x) # Builds model architecture
y_pred_cls = tf.argmax(y_pred, axis=1)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true)
cost = tf.reduce_mean(cross_entropy)
optimizer = tf.train.MomentumOptimizer(learn_rate, 0.9, use_locking=False, use_nesterov=True).minimize(cost)
accuracy = tf.reduce_mean(tf.cast(tf.equal(y_pred_cls, y_true_cls), tf.float32))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf_saver = tf.train.Saver()
train(num_iteration) # Trains the network and saves the model
sess.close()
Testing script
sess = tf.Session()
tf_saver = tf.train.import_meta_graph('model/model.meta')
tf_saver.restore(sess, tf.train.latest_checkpoint('model'))
x = tf.get_default_graph().get_tensor_by_name('x:0')
y_true = tf.get_default_graph().get_tensor_by_name('y_true:0')
y_true_cls = tf.argmax(y_true, axis=1)
y_pred = tf.get_default_graph().get_tensor_by_name('y_pred:0') # refers to FC2 in the model
y_pred_cls = tf.argmax(y_pred, axis=1)
correct_prediction = tf.equal(y_pred_cls, y_true_cls)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
images, labels = read_data() # read data for testing
feed_dict_test = {x: images, y_true: labels}
test_acc = sess.run(accuracy, feed_dict=feed_dict_test)
sess.close()
Upvotes: 1
Views: 4428
Reputation: 956
You can just perform sess.run on the right tensor to get the values. First you need the tensor. You can give it a name inside build_model by adding a name argument (which you can do for any tensor), e.g.:
FC1 = tf.add(tf.multiply(Flat, W1), b1, name="FullyConnected1")
Later, you can get the tensor for the fully connected layer and evaluate it:
with tf.Session() as sess:
FC1 = tf.get_default_graph().get_tensor_by_name('FullyConnected1:0')
FC1_values = sess.run(FC1, feed_dict={x: input_img_arr})
(This is assuming there is no other layer called FullyConnected1 in the graph)
Upvotes: 4