Как изменить функцию tf.image.per_image_standardization () в тензорном потоке? - PullRequest
0 голосов
/ 25 апреля 2018

tf.image.per_image_standardization() в Tensorflow преобразует каждое изображение с нулевым средним и единичной дисперсией.Так что это приводит к неразрывным градиентам при обучении модели глубокого обучения. Но когда мы хотим отобразить массив изображений, как мы можем отменить этот шаг нормализации z-счета в Tensorflow?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Слой tf.image.per_image_standardization() создаст некоторые внутренние переменные, которые можно использовать для восстановления исходных данных.Обратите внимание, что это недокументированное поведение и не гарантируется, что он останется прежним.Тем не менее, пока вы можете использовать приведенный ниже код (проверено) для справки, как получить соответствующие тензоры и восстановить исходные данные:

import tensorflow as tf
import numpy as np

img_size = 3
a = tf.placeholder( shape = ( img_size, img_size, 1 ), dtype = tf.float32 )
b = tf.image.per_image_standardization( a )

with tf.Session() as sess:
    tensors, tensor_names = [], []
    for l in sess.graph.get_operations():
        tensors.append( sess.graph.get_tensor_by_name( l.name + ":0" ) )
        tensor_names.append( l.name )

    #mean_t = sess.graph.get_tensor_by_name( "per_image_standardization/Mean:0" )
    #variance_t = sess.graph.get_tensor_by_name( "per_image_standardization/Sqrt:0" )

    foobar = np.reshape( np.array( range( img_size * img_size ), dtype = np.float32 ), ( img_size, img_size, 1 ) )
    res =  sess.run( tensors, feed_dict = { a : foobar } )
    #for i in xrange( len( res ) ):
    #    print( i, tensor_names[ i ] + ":" )
    #    print( res[ i ] )
    #    print()

    mean = res[ 6 ] # "per_image_standardization/Mean:0"
    variance = res[ 13 ] # "per_image_standardization/Sqrt:0"
    standardized = res[ 18 ] # "per_image_standardization:0"
    original = standardized * variance + mean
    print( original )

Вы можете раскомментировать строки mean_t и variance_t, чтобыполучить ссылку на соответствующие тензоры по имени.(Требуется некоторая перезапись части sess.run().) Вы можете раскомментировать четыре строки, начинающиеся с for i in xrange(... (перезапись не требуется), чтобы напечатать все доступные созданные тензоры для вашего редактирования.:)

Вышеприведенный код, как есть, выводит:

[[[0.]
[1.]
[2.]]

[[3.]
[4.]
[5.]]

[[6.]
[7.]
[8.]]]

Это именно те данные, которые были переданы в сеть.

0 голосов
/ 25 апреля 2018

Под «отображать массив изображений» я предполагаю, что вы хотите отобразить его в тензорной доске.Если это так, то вам не нужно ничего делать, тензорная доска может обрабатывать изображения, которые были стандартизированы.Если вы хотите использовать исходное значение для каких-либо других целей, почему бы просто не использовать переменную до ее стандартизации, например:

img = tf.placeholder(...)
img_std = tf.image.per_image_standardization(img)

Вы можете работать с img или img_std любым удобным для вас способом.fit.

Если у вас есть какой-то сценарий использования для денормализации стандартизированного изображения, который не описан выше, вам нужно будет самостоятельно рассчитать среднее и стандартное отклонение, затем умножить на стандартное отклонение и добавить среднее.Обратите внимание, что tf.image.per_image_standardization использует adjusted_stddev, который определен в документации как:

adjusted_stddev = max(stddev, 1.0/sqrt(image.NumElements()))
...