После обучения модели cnn я хочу визуализировать вес или распечатать вес, что я могу сделать? Я не могу даже распечатать переменные после обучения. Спасибо!
Как я могу визуализировать веса (переменные) в cnn в Tensorflow?
Ответ 1
Чтобы визуализировать весы, вы можете использовать tf.image_summary()
op для преобразования сверточного фильтра (или среза фильтра) в summary proto, записать их в журнал с помощью 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)
После этого вы можете запустить TensorBoard для визуализации журналов в /tmp/logs
, и вы сможете увидеть визуализацию фильтра.
Обратите внимание, что этот трюк визуализирует фильтры глубины 3 как изображения RGB (для соответствия каналам входного изображения). Если у вас есть более глубокие фильтры или они не имеют смысла интерпретировать цветные каналы, вы можете использовать tf.split()
op для разделения фильтра по размеру глубины и сгенерировать одно изображение на глубину.
Ответ 2
Как и @mrry, вы можете использовать tf.image_summary
. Например, для cifar10_train.py
вы можете поместить этот код где-нибудь под def train()
. Обратите внимание на то, как вы получаете доступ к переменной var по области "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)
Если вы хотите визуализировать все ваши фильтры conv1
в одной красивой сетке, вам придется самостоятельно организовать их в сетке. Я сделал это сегодня, поэтому теперь хотел бы поделиться gist для визуализации conv1 как сетки
Ответ 3
Вы можете извлечь значения в виде массивов 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)