2017-12-09 22 views
1

最近TensorFlow(TF)の使用を開始しました。私はいくつかの助けが必要な問題に遭遇しました。基本的には、事前に訓練されたモデルを復元しました。その精度を再テストする前に、レイヤの1つのウェイトとバイアスを変更する必要があります。今、私の問題は次のとおりです: TFのassignメソッドを使用して重みと偏りを変更するにはどうすればよいですか? TFで復元されたモデルの重みを修正することも可能ですか?ここでTensorFlowで復元されたCNNモデルの重みと偏りを修正する

は私のコードです:

import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data # Imports the MINST dataset 

# Data Set: 
# --------- 
mnist = input_data.read_data_sets("/home/frr/MNIST_data", one_hot=True)# An object where data is stored 

ImVecDim = 784# The number of elements in a an image vector (flattening a 28x28 2D image) 
NumOfClasses = 10 

g = tf.get_default_graph() 

with tf.Session() as sess: 
    LoadMod = tf.train.import_meta_graph('simple_mnist.ckpt.meta') # This object loads the model 
    LoadMod.restore(sess, tf.train.latest_checkpoint('./'))# Loading weights and biases and other stuff to the model 

    # (Here I'd like to modify the weights and biases of layer 1, set them to one for example, before I go ahead and test the accuracy) # 

    # Testing the acuracy of the model: 
    X = g.get_tensor_by_name('ImageIn:0') 
    Y = g.get_tensor_by_name('LabelIn:0') 
    KP = g.get_tensor_by_name('KeepProb:0') 
    Accuracy = g.get_tensor_by_name('NetAccuracy:0') 
    feed_dict = { X: mnist.test.images[:256], Y: mnist.test.labels[:256], KP: 1.0 } 
    print('Model Accuracy = ') 
    print(sess.run(Accuracy, feed_dict)) 

答えて

0

テンソル更新は、既存の解答に加えて、tf.assign関数を使用して実行することができます。答えみんなのために

v1 = sess.graph.get_tensor_by_name('v1:0') 
print(sess.run(v1)) # 1.0 
sess.run(tf.assign(v1, v1 + 1)) 
print(sess.run(v1)) # 2.0 
0

はい、それは可能です。メタグラフを読み込んだ後、荷重と偏りが既に読み込まれています。彼らの名前を見つける必要があります(list_variablesの関数を参照)。そしてそれらをPython変数に代入する必要があります。

そのためには、変数名にtf.get_variableを使用してください。可変範囲にreuse=Trueを設定する必要があるかもしれません。変数の再利用の詳細については、this answerを参照してください。

変数がweightsになったら、sess.run(weights.assign(...))に電話することができます。

+0

ありがとうございます。私はちょうど1つのフォローアップの質問があります。私はこれらの変数の名前を知っています。重みはwc1、バイアスはbc1ですが、どのようにアクセスできますか? wc1 = g.get_tensor_by_name( 'wc1:0')は、変数ではなくテンソルを返します。したがって、assignメソッドは適用できません(例:sess.run(wc1.assign(..))! – Muhammad

+0

@Muhammadは変数名で 'tf.get_variable'を呼び出し、可変スコープで' reuse = True'を設定します。 –

0

感謝。私はちょうど一緒に作品を入れたいと思います。これは、私が欲しいものを達成するのに役立つコードです:

import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data # Imports the MINST dataset 

# Data Set: 
# --------- 
mnist = input_data.read_data_sets("/home/frr/MNIST_data", one_hot=True)# An object where data is stored 

ImVecDim = 784# The number of elements in a an image vector (flattening a 28x28 2D image) 
NumOfClasses = 10 

g = tf.get_default_graph() 

with tf.Session() as sess: 
    LoadMod = tf.train.import_meta_graph('simple_mnist.ckpt.meta') # This object loads the model 
    LoadMod.restore(sess, tf.train.latest_checkpoint('./'))# Loading weights and biases and other stuff to the model 

    wc1 = g.get_tensor_by_name('wc1:0') 
    sess.run(tf.assign(wc1,tf.multiply(wc1,0)))# Setting the values of the variable 'wc1' in the model to zero. 

    # Testing the acuracy of the model: 
    X = g.get_tensor_by_name('ImageIn:0') 
    Y = g.get_tensor_by_name('LabelIn:0') 
    KP = g.get_tensor_by_name('KeepProb:0') 
    Accuracy = g.get_tensor_by_name('NetAccuracy:0') 
    feed_dict = { X: mnist.test.images[:256], Y: mnist.test.labels[:256], KP: 1.0 } 
    print('Model Accuracy = ') 
    print(sess.run(Accuracy, feed_dict)) 
関連する問題