Визуализация весов обучаемой модели Tensorflow [duplicate]

У меня был тот же вопрос, и я понял, используя getBoundingClientRect (). Этот код полностью «общий» и должен быть написан только один раз для его работы (вам не нужно записывать его для каждого элемента, который вы хотите знать, в окне просмотра). Этот код проверяет, не вертикально ли он в вертикальном направлении, а не по горизонтали. В этом случае переменные (массивы) «элементы» содержат все элементы, которые вы проверяете, чтобы они были вертикально в окне просмотра, поэтому хватайте любые элементы, которые вы хотите где угодно, и храните их там. Цикл «for» циклически проходит через каждый элемент и проверяет, находится ли он вертикально в окне просмотра. Этот код выполняется каждый раз, когда пользователь прокручивается! Если верхняя часть getBoudingClientRect () меньше 3/4, то окно просмотра (элемент составляет одну четверть в окне просмотра), он регистрируется как «в окне просмотра». Поскольку код является общим, вам нужно знать, какой элемент находится в окне просмотра. Чтобы узнать это, вы можете определить его по пользовательскому атрибуту, имени узла, идентификатору, имени класса и т. Д. Вот мой код (скажите, если он не работает, он был протестирован в IE 11, FireFox 40.0.3, Chrome версии 45.0.2454.85 m, Opera 31.0.1889.174 и Edge с Windows 10, [еще не Safari] ) ...

//scrolling handlers...
window.onscroll = function(){
  var elements = document.getElementById('whatever').getElementsByClassName('whatever');
  for(var i = 0; i != elements.length; i++)
  {
   if(elements[i].getBoundingClientRect().top <= window.innerHeight*0.75 && elements[i].getBoundingClientRect().top > 0)
   {
      console.log(elements[i].nodeName + ' ' + elements[i].className + ' ' + elements[i].id + ' is in the viewport; proceed with whatever code you want to do here.');
   }
};

Надеюсь, это поможет кому-то: -)

32
задан Hooked 23 May 2016 в 03:19
поделиться

3 ответа

Как и @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 в одной красивой сетке, вам придется самостоятельно организовать их в сетке. Я сделал это сегодня, так что теперь я хотел бы поделиться g0-gist для визуализации conv1 в виде сетки

20
ответ дан etoropov 24 August 2018 в 08:48
поделиться

Вы можете извлечь значения в виде массивов 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)
3
ответ дан Martin Thoma 24 August 2018 в 08:48
поделиться

Чтобы визуализировать весы, вы можете использовать tf.image_summary() op для преобразования сверточного фильтра (или среза фильтра) в итоговый прото, записать их в журнал с помощью 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 для разделения фильтра на размеру глубины и генерации одного изображения на глубину .

26
ответ дан mrry 24 August 2018 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: