2017-04-01 4 views
2

私はモデルをトレーニングした後にウェイトを抽出しようとしています。ここでおもちゃの例tensorflowからウェイトを取得する方法fully_connected

import tensorflow as tf 
import numpy as np 

X_ = tf.placeholder(tf.float64, [None, 5], name="Input") 
Y_ = tf.placeholder(tf.float64, [None, 1], name="Output") 

X = ... 
Y = ... 
with tf.name_scope("LogReg"): 
    pred = fully_connected(X_, 1, activation_fn=tf.nn.sigmoid) 
    loss = tf.losses.mean_squared_error(labels=Y_, predictions=pred) 
    training_ops = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(200): 
     sess.run(training_ops, feed_dict={ 
      X_: X, 
      Y_: Y 
     }) 
     if (i + 1) % 100 == 0: 
      print("Accuracy: ", sess.run(accuracy, feed_dict={ 
       X_: X, 
       Y_: Y 
      })) 

# Get weights of *pred* here 

私はGet weights from tensorflow model でかつdocsを見てきましたが、重みの値を取得する方法を見つけることができないのです。

だから、おもちゃの例の場合では、X_は形状があるとし(1000、5)、私はする必要がありますあなたのコード内のいくつかの問題があります

答えて

6

後1層の重量の5つの値を取得する方法修正される:

1-あなたは次の行でvariable_scopeの代わりname_scopeを使用する必要があります(両者の差のためにTensorFlowのマニュアルを参照してください):

with tf.name_scope("LogReg"): 

2-変数を取得できるようにするには後でcあなたはその名前を知る必要があります。だから、あなたは(あなたが1をサポートしていない場合は、デフォルトの割り当てられたものがあるだろうが、その後、あなたはそれが何であるかを把握する必要があります!)関心の変数に名前を割り当てる必要があります。

pred = tf.contrib.layers.fully_connected(X_, 1, activation_fn=tf.nn.sigmoid, scope = 'fc1') 

上記の修正が変数の値を取得するためにどのように役立つかを見てみましょう。各レイヤーには、重みとバイアスの2種類の変数があります。次のコードスニペット(あなたの修正版)では、完全に接続されたレイヤーのウェイトを取得する方法のみを示します。

X_ = tf.placeholder(tf.float64, [None, 5], name="Input") 
Y_ = tf.placeholder(tf.float64, [None, 1], name="Output") 

X = np.random.randint(1,10,[10,5]) 
Y = np.random.randint(0,2,[10,1]) 

with tf.variable_scope("LogReg"): 
    pred = tf.fully_connected(X_, 1, activation_fn=tf.nn.sigmoid, scope = 'fc1') 
    loss = tf.losses.mean_squared_error(labels=Y_, predictions=pred) 
    training_ops = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

with tf.Session() as sess: 

    all_vars= tf.global_variables() 
    def get_var(name): 
     for i in range(len(all_vars)): 
      if all_vars[i].name.startswith(name): 
       return all_vars[i] 
     return None 
    fc1_var = get_var('LogReg/fc1/weights') 

    sess.run(tf.global_variables_initializer())  
    for i in range(200): 
     _,fc1_var_np = sess.run([training_ops,fc1_var], feed_dict={ 
     X_: X, 
     Y_: Y 
     }) 
     print fc1_var_np 
+0

ありがとう@Ali。凍った '.pb'モデルファイルで重みを見る方法についてMWEを提供できますか? inception_v3と言ってください。 op.type!= 'placeholder' op.values(out.dtype == tf.float32の場合)の場合はout_val = sess.run([アウト・タイム= tf.float32の場合は、tf.get_default_graph(op)の場合はget_operations() 、 feed_dict = my_feed_dict) 'このアプローチは私のためには機能しません。 – Amir

関連する問題