簡體   English   中英

如何獲得經過訓練的CNN模型的某一層的輸出[Tensorflow]

[英]How to get the output of certain layer of trained CNN model [Tensorflow]

我有一個用於image classificationCNN模型,該模型已針對我的數據集進行了訓練。 該模型是這樣的

Convolution 
Relu
pooling

Convolution 
Relu
Convolution 
Relu
pooling

flat

fully connected (FC1)
Relu
fully connected (FC2)
softmax

訓練后,我想獲得輸入到預訓練模型中的圖像的特征向量,即我想獲得FC1層的輸出。 有什么方法可以獲取它,我瀏覽了網絡,但找不到任何有用的建議,對您有很大幫助。

訓練腳本

# 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()

測試腳本

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()

您可以只在正確的張量上執行sess.run來獲取值。 首先,您需要張量。 您可以在build_model內通過添加名稱參數(可以對任何張量執行此操作)為其命名,例如:

FC1 = tf.add(tf.multiply(Flat, W1), b1, name="FullyConnected1")

稍后,您可以獲取完全連接層的張量並對其進行評估:

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})        

(這是假設圖中沒有其他稱為FullyConnected1的層)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM