Тензор потока Conv2D из нулей возвращает ненулевое значение? - PullRequest
0 голосов
/ 09 декабря 2018

Я создал тензор, установленный в ноль, за исключением одной записи в [:, - 1, -1,0], для которой было установлено большое число 1e10.Затем я свернул тензор со случайным ядром.Когда размер пакета мал (например, 5), тогда вывод в [:, 0,0 ,:] равен нулю (потому что входной массив там равен нулю), но когда размер пакета велик (например, 100), тогда эти записи содержатчисла значительно больше нуля.Это происходит только на GPU.

import tensorflow as tf
import numpy as np


def test(sess):
    w = np.random.uniform(size=(5,5,64,64)).astype(np.float32)
    x_t = tf.placeholder(dtype=tf.float32, shape=(None, 32, 32, 64))
    w_t = tf.constant(w)
    o_t = tf.nn.conv2d(x_t, w_t, [1,1,1,1], 'VALID', data_format='NHWC')
    x_good = np.zeros((5,32,32, 64), dtype=np.float32)
    x_good[:,-1,-1,0] = 1e10
    x_bad = np.zeros((100,32,32, 64), dtype=np.float32)
    x_bad[:,-1,-1,0] = 1e10
    o_good = sess.run(o_t, feed_dict={x_t : x_good})
    o_bad = sess.run(o_t, feed_dict={x_t : x_bad})
    print('Number nonzero (good): ', np.count_nonzero(o_good[:,0,0,:]))
    print('Number nonzero (bad): ', np.count_nonzero(o_bad[:,0,0,:]))
    if np.count_nonzero(o_bad[:,0,0,:]) > 0:
        print(o_bad[0,0,0,:])

with tf.Session() as sess:
    with tf.device('cpu:0'):
        print('Testing on cpu -- should succeed')
        test(sess)
    with tf.device('gpu:0'):
        print('Testing on gpu -- typically fails')
        test(sess)
...