2015-11-18 32 views
29

cnnモデルをトレーニングした後、体重を視覚化したり、体重を印刷したりしたいのですが、何ができますか? トレーニング後に変数を印刷することさえできません。 ありがとうございました!重みを視覚化するTensorflowでcnnの重み(変数)をどのように視覚化できますか?

+0

で、tensorboard例を見てみましょう:https://github.com/tensorflow/tensorflow/issues/225 – Blaze

+0

も参照してください:[tensorflowコンボリューションフィルタを可視化することができますどのように?](http://stackoverflow.com/q/39361943/562769) –

答えて

25

、あなたは、要約プロトに畳み込みフィルタ(またはフィルタのスライス)を変換するためにtf.image_summary()オペアンプを使用tf.train.SummaryWriterを使用してログにそれらを書き、TensorBoardを使用してログを可視化することができます。

のは、次の(簡体字)のプログラムがあるとしましょう:

filter = tf.Variable(tf.truncated_normal([8, 8, 3])) 
images = tf.placeholder(tf.float32, shape=[None, 28, 28]) 

conv = tf.nn.conv2d(images, filter, strides=[1, 1, 1, 1], padding="SAME") 

# More ops... 
loss = ... 
optimizer = tf.GradientDescentOptimizer(0.01) 
train_op = optimizer.minimize(loss) 

filter_summary = tf.image_summary(filter) 

sess = tf.Session() 
summary_writer = tf.train.SummaryWriter('/tmp/logs', sess.graph_def) 
for i in range(10000): 
    sess.run(train_op) 
    if i % 10 == 0: 
    # Log a summary every 10 steps. 
    summary_writer.add_summary(filter_summary, i) 

これを実行した後、あなたは/tmp/logsでログを視覚化するTensorBoardを開始することができ、あなたは、フィルタの可視化を見ることができます。

このトリックは、深さ3のフィルタを(入力画像のチャンネルと一致するように)RGB画像として視覚化することに注意してください。より深いフィルタがある場合、またはカラーチャンネルとして解釈する意味がない場合は、tf.split()オペレーションを使用して、奥行き寸法でフィルタを分割し、深度ごとに1つの画像サマリを生成することができます。

+0

私はそれを印刷したいのですが? name_scope ike "conv1"で変数に到達するにはどうしたらいいですか? – Wuchen

+1

変数を出力したいだけなら、 'tf.Variable'オブジェクトを' sess.run() 'に渡すことができ、それは重みを含むnumpy配列を返します。 – mrry

+1

@ Wuchen scope_convとしてtf.variable_scope( 'conv1')を使用してスコープ "conv1"の下に変数 "weight"を取得する方法は次のとおりです:weights = tf.get_variable( 'weights') – etoropov

18

@mrryと同様に、tf.image_summaryを使用できます。たとえば、cifar10_train.pyの場合は、このコードをdef train()のどこかに置くことができます。あなたは1つの素敵なグリッド内のすべてのあなたのconv1フィルタを視覚化したい場合は、スコープ「CONV1」

# Visualize conv1 features 
with tf.variable_scope('conv1') as scope_conv: 
    weights = tf.get_variable('weights') 

    # scale weights to [0 255] and convert to uint8 (maybe change scaling?) 
    x_min = tf.reduce_min(weights) 
    x_max = tf.reduce_max(weights) 
    weights_0_to_1 = (weights - x_min)/(x_max - x_min) 
    weights_0_to_255_uint8 = tf.image.convert_image_dtype (weights_0_to_1, dtype=tf.uint8) 

    # to tf.image_summary format [batch_size, height, width, channels] 
    weights_transposed = tf.transpose (weights_0_to_255_uint8, [3, 0, 1, 2]) 

    # this will display random 3 filters from the 64 in conv1 
    tf.image_summary('conv1/filters', weights_transposed, max_images=3) 

下VARへのアクセス方法に注意してください、あなたはグリッド自身にそれらを整理する必要があります。私は今、私はあなたがnumpyの配列として、次のように値を抽出することができますgist for visualizing conv1 as a grid

+0

私のために働きなさい!ありがとう – Tanvir

+1

チャンネルが16の場合、それを視覚化する方法? – raptoravis

+0

@raptoravisデフォルトの方法はなく、あまり意味がありません。私はこれが最初の層のためではないと推測しています。もし私がそれをやりたいのであれば、回答の要点を変更して1つのチャンネル(グレースケール)ごとに16グリッドを表示してください – etoropov

1

を共有したいと思い、今日のことをやった:あなたはスコープを調整する必要が

with tf.variable_scope('conv1', reuse=True) as scope_conv: 
    W_conv1 = tf.get_variable('weights', shape=[5, 5, 1, 32]) 
    weights = W_conv1.eval() 
    with open("conv1.weights.npz", "w") as outfile: 
     np.save(outfile, weights) 

注(私の中'conv1'ケース)と変数名(私のケースでは'weights')。

次に、numpy配列の可視化に沸騰します。 numpyの配列を可視化する方法を一例としては、また

#!/usr/bin/env python 

"""Visualize numpy arrays.""" 

import numpy as np 
import scipy.misc 

arr = np.load('conv1.weights.npb') 

# Get each 5x5 filter from the 5x5x1x32 array 
for filter_ in range(arr.shape[3]): 
    # Get the 5x5x1 filter: 
    extracted_filter = arr[:, :, :, filter_] 

    # Get rid of the last dimension (hence get 5x5): 
    extracted_filter = np.squeeze(extracted_filter) 

    # display the filter (might be very small - you can resize the window) 
    scipy.misc.imshow(extracted_filter) 
+0

私はpython 3でoutfile: '(注記b)として' open( "conv1.weights.npz"、 "wb")を使用しなければなりませんでした。 – mimoralea

関連する問題