46

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

4

4 に答える 4

37

重みを視覚化するには、tf.image_summary()op を使用して畳み込みフィルター (またはフィルターのスライス) を要約プロトコルに変換し、 を使用してそれらをログに書き込み、TensorBoardtf.train.SummaryWriterを使用してログを視覚化します。

次の(簡略化された)プログラムがあるとします。

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)

これを行った後、TensorBoard を起動して でログを視覚/tmp/logs化すると、フィルターの視覚化を確認できるようになります。

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

于 2015-11-19T02:55:47.200 に答える
22

@mrryが言ったように、使用できますtf.image_summary。たとえば、 の場合、cifar10_train.pyこのコードを の下のどこかに置くことができますdef train()。スコープ「conv1」の下でvarにアクセスする方法に注意してください

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

すべてのconv1フィルターを 1 つの見やすいグリッドで視覚化する場合は、それらを自分でグリッドに編成する必要があります。今日はそれを行ったので、conv1 をグリッドとして視覚化するための要点を共有したいと思います

于 2016-03-08T04:17:57.137 に答える
7

次の方法で、値を numpy 配列として抽出できます。

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)
于 2016-11-17T10:49:12.823 に答える
0

を使用するtensorflow 2 APIと、いくつかのオプションがあります。

get_weights()関数を使用して抽出された重み 。

weights_n = model.layers[n].get_weights()[0]

numpy()convert 関数を使用して抽出されたバイアス。

bias_n = model.layers[n].bias.numpy()

于 2021-07-05T10:47:04.527 に答える