Как сделать сверточный слой в тензорном потоке? - PullRequest
0 голосов
/ 12 мая 2018

Я написал код для слоя деконволюции,

def deconv2d(x, W,stride):
  x_shape = tf.shape(x)
  output_shape = tf.stack([x_shape[0], x_shape[1]*2, x_shape[2]*2, x_shape[3]//2])
  decon = tf.nn.conv2d_transpose(x, W, output_shape, strides=[1, stride, stride, 1], padding='SAME')
  layer_shape = get_layer_shape(decon)
  print('DECONV Shape : ', layer_shape)
  return  decon

Я назвал вышеуказанную функцию следующим образом,

deconvolution1 = deconv2d(x=cnn_layer10, W=[2,2,512,1024], stride=2)

получаю эту ошибку,

Файл "u-net.py", строка 84, в obj.computation () Файл "u-net.py", строка 41, в расчете deconvolution1 = deconv2d (x = cnn_layer10, W = [2,2,512,1024], stride = 2) Файл "/home/shuvo/u-net/architecture.py", строка 35, в deconv2d decon = tf.nn.conv2d_transpose (x, W, output_shape, stepdes = [1, stepde, stepde, 1], padding = 'SAME') Файл "/Usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/nn_ops.py", строка 1019, в conv2d_transpose если нет value.get_shape () [axis] .is_compatible_with (filter.get_shape () [3]):
файл "/Usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/tensor_shape.py", строка 500, в getitem return self._dims [ключ] IndexError: список индексов вне диапазона

Мое намерение - сделать слой деконволюции там, где должна быть форма, [batch_size, 36,36,1024] => [batch_size, 72,72,512]. Пожалуйста, помогите мне исправить эту ошибку,

1 Ответ

0 голосов
/ 12 мая 2018

Аргументы ввода filter до tf.nn.conv2d_transpose - это сама матрица весов, а не только размер фильтра.

Измененный код, который устраняет вышеуказанную проблему, показан ниже:

cnn_layer10 = tf.placeholder(tf.float32, (10, 36, 36, 1024))

def deconv2d(x, W,stride):
   x_shape = tf.shape(x)    
   weights = tf.Variable(tf.random_normal(W))
   output_shape = tf.stack([x_shape[0], x_shape[1]*2, x_shape[2]*2, x_shape[3]//2])
   decon = tf.nn.conv2d_transpose(x, weights, output_shape, strides=[1, stride, stride, 1], padding='SAME')

   return  decon

deconvolution1 = deconv2d(x=cnn_layer10, W=[2,2,512,1024], stride=2)

with tf.Session() as sess:
   sess.run(tf.global_variables_initializer())
   print('Decon Shape:',sess.run(deconvolution1, {cnn_layer10: np.random.random((10, 36,36,1024))}).shape)
   #Output
   #Decon Shape: (10, 72, 72, 512)

Примечание. Лучше использовать tf.layers.conv2d_transpose API, где filters arg - это размер фильтра, а инициализация весов происходит внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...