У меня был тот же вопрос, и я понял, используя 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.');
}
};
Надеюсь, это поможет кому-то: -)
Как и @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 в виде сетки
Вы можете извлечь значения в виде массивов 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)
Чтобы визуализировать весы, вы можете использовать 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 для разделения фильтра на размеру глубины и генерации одного изображения на глубину .