Как увеличить размер фильтров deconv2d для фиксированного размера данных?

Я пытаюсь настроить этот код DCGAN для работы с образцами данных 2x80.

Все слои генератора tf.nn.deconv2d кроме h0, который является ReLu. Размеры фильтра генератора для уровня в настоящее время:

Generator: h0: s_h16 x s_w16: 1  x  5
Generator: h1: s_h8 x s_w8: 1  x  10
Generator: h2: s_h4 x s_w4: 1  x  20
Generator: h3: s_h2 x s_w2: 1  x  40
Generator: h4: s_h x s_w: 2  x  80

Из-за характера моих данных я хотел бы, чтобы они были изначально сгенерированы как 2 x ..., т.е. чтобы фильтры были 2 x 5, 2 x 10, 2 x 20, 2 x 40, а также 2 x 80, Однако, когда я просто вручную ввести s_h16 = 2 * s_h16 и так далее до s_h2 = 2 * s_h2Я сталкиваюсь со следующей ошибкой:

ValueError: Shapes (64, 1, 40, 64) and (64, 2, 40, 64) are not compatible

Так что я знаю, что ошибка происходит на уровне h3, но я не могу ее отследить (здесь размер пакета 64). Есть идеи, как это можно исправить?


Редактировать: отредактированный код DCGANs находится в этом хранилище, после настройки потока DCGAN-тензор, как в инструкциях, которые вам нужно будет поместить в папку Data_npy в DCGAN-tensorflow/data папка.

Потом работает python main.py --dataset Data_npy --input_height=2 --output_height=2 --train предоставит вам ошибку, которую я получаю.

Полная трассировка ошибок выглядит следующим образом:

Traceback (most recent call last):
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/framework/tensor_shape.py", line 560, in merge_with
    new_dims.append(dim.merge_with(other[i]))
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/framework/tensor_shape.py", line 135, in merge_with
    self.assert_is_compatible_with(other)
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/framework/tensor_shape.py", line 108, in assert_is_compatible_with
    % (self, other))
ValueError: Dimensions 1 and 2 are not compatible

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 97, in <module>
    tf.app.run()
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/platform/app.py", line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "main.py", line 80, in main
    dcgan.train(FLAGS)
  File "/home/marija/DCGAN-tensorflow/model.py", line 180, in train
    .minimize(self.g_loss, var_list=self.g_vars)
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/training/optimizer.py", line 315, in minimize
    grad_loss=grad_loss)
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/training/optimizer.py", line 386, in compute_gradients
    colocate_gradients_with_ops=colocate_gradients_with_ops)
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/ops/gradients_impl.py", line 580, in gradients
    in_grad.set_shape(t_in.get_shape())
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 413, in set_shape
    self._shape = self._shape.merge_with(shape)
  File "/home/marija/.local/lib/python3.5/site-packages/tensorflow/python/framework/tensor_shape.py", line 564, in merge_with
    (self, other))
ValueError: Shapes (64, 1, 40, 64) and (64, 2, 40, 64) are not compatible

1 ответ

Решение

В вашем файле ops.py

Ваша проблема связана с размером шага в вашем фильтре deconv, измените заголовок для conv2d а также deconv2d чтобы:

def conv2d(input_, output_dim, 
       k_h=5, k_w=5, d_h=1, d_w=2, stddev=0.02,
       name="conv2d"):

def deconv2d(input_, output_shape,
       k_h=5, k_w=5, d_h=1, d_w=2, stddev=0.02,
       name="deconv2d", with_w=False):

Вот так он начал тренироваться для меня. Я не проверял вывод, хотя.

Проблема заключается в том, что, учитывая форму вашего ввода, ограничение высоты на 2 (исходное значение для d_h) приведет к (64, 1, 40, 64) форма во время обратного распространения. (Потому что у вас есть только 2 значения)

Также вы можете подумать, чтобы изменить k_h=5 в k_h=2 поскольку брать 5 элементов по высоте, когда у вас есть только 2, не имеет особого смысла.

Другие вопросы по тегам