Я студент, работающий над воссозданием статьи «Фотореалистичное сверхвысокое разрешение для одного изображения с использованием генерирующей состязательной сети» с использованием TensorFlow. При попытке проверить сеть после завершения обучения я получаю сообщение об ошибке несовместимых фигур (хотя это сработало для обучения). Кажется, эта ошибка связана с Keras Sequential.
Конец ошибки дает:
File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [24,24,64] vs. [16,256,256,64] [Op:Mul] name: generator/sequential/p_re_lu/mul/
Если входная форма обучения равна (16,24,24,3)
, а входная форма тестирования равна (1,256,256,3)
. Первые слои в сети - это слой tf.keras.layers.Conv2D(64, 9, strides=1, padding='same'),
.
Я отделил некоторые слои от последовательных и напечатал выходные формы для проверки. Слои, которые я оставил в последовательных блоках, выдают ту же ошибку, в то время как разделенные работают нормально
выход:
x_in: (16, 24, 24, 3)
x1: (16, 24, 24, 64)
x2a: (16, 24, 24, 64)
x2: (16, 24, 24, 64)
x3: (16, 24, 24, 64)
x4: (16, 48, 48, 256)
x5: (16, 96, 96, 256)
x_out: (16, 96, 96, 3)
x_in: (1, 256, 256, 3)
x1: (1, 256, 256, 64)
x2a: (1, 256, 256, 64)
Traceback (most recent call last):
File "srgan.py", line 249, in <module> ...
Последовательный блок:
self.residual = tf.keras.Sequential([
Residual(cfg, num_filters),
Residual(cfg, num_filters),
Residual(cfg, num_filters),
Residual(cfg, num_filters),
])
Функция вызова
def call(self, x_in):
print(f'x_in: {x_in.shape}')
x1a = tf.keras.layers.Conv2D(64, 9, strides=1, padding='same')(x_in)
x1 = tf.keras.layers.PReLU()(x1a)
#x1 = self.start(x_in)
print(f'x1: {x1.shape}')
x2a = Residual(self.cfg, 64)(x1)
print(f'x2a: {x2a.shape}')
x2 = self.residual(x1)
Я ожидаю, что последовательный будет работать так же, как разделенные слои. Я что-то упустил или это ошибка?
edit1:
Когда я сказал, что разделил слои, я имел в виду перемещение слоев за пределы последовательного.
Я удалил их все и попробовал модель снова. Ошибка теперь для tf.keras.layers.PReLU()
, что имеет смысл, поскольку упомянутая ошибка name: generator/sequential/p_re_lu/mul/
Странно, что это приводит к ошибке сравниваемых фигур
Вот краткое изложение модели
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) multiple 15616
_________________________________________________________________
p_re_lu (PReLU) multiple 36864
_________________________________________________________________
residual (Residual) multiple 111232
_________________________________________________________________
residual_1 (Residual) multiple 111232
_________________________________________________________________
residual_2 (Residual) multiple 111232
_________________________________________________________________
residual_3 (Residual) multiple 111232
_________________________________________________________________
conv2d_9 (Conv2D) multiple 331840
_________________________________________________________________
batch_normalization_v2_8 (Ba multiple 256
_________________________________________________________________
conv2d_transpose (Conv2DTran multiple 147712
_________________________________________________________________
p_re_lu_5 (PReLU) multiple 589824
_________________________________________________________________
conv2d_transpose_1 (Conv2DTr multiple 590080
_________________________________________________________________
p_re_lu_6 (PReLU) multiple 2359296
_________________________________________________________________
conv2d_10 (Conv2D) multiple 6915
=================================================================
Total params: 4,523,331
Trainable params: 4,522,179
Non-trainable params: 1,152