#python #tensorflow #deep-learning #conv-neural-network
Вопрос:
У меня возникла проблема с реализацией модели со сверхразрешением
class SRNet(Model): def __init__(self, scale=4): super(SRNet, self).__init__() self.scale = scale self.conv1 = Sequential([ layers.Conv2D(filters=64, kernel_size=3, strides=(1, 1), padding="same", data_format="channels_first"), layers.ReLU(), ]) self.residualBlocks = Sequential( [ResidualBlock() for _ in range(16)]) self.convUp = Sequential([ layers.Conv2DTranspose(filters=64, kernel_size=3, strides=( 2, 2), padding="same", data_format="channels_first"), layers.ReLU(), layers.Conv2DTranspose(filters=64, kernel_size=3, strides=( 2, 2), padding="same", data_format="channels_first"), layers.ReLU(), ]) self.reluAfterPixleShuffle = layers.ReLU() self.convOut = layers.Conv2D( filters=3, kernel_size=3, strides=(1, 1), padding="same", data_format="channels_first", input_shape=(4, 1440, 2560)) # (kernel, kernel, channel, output) def call(self, lrCur_hrPrevTran): lrCur, hrPrevTran = lrCur_hrPrevTran x = tf.concat([lrCur, hrPrevTran], axis=1) x = self.conv1(x) x = self.residualBlocks(x) x = self.convUp(x) # pixel shuffle Subpixel_layer = Lambda(lambda x: tf.nn.depth_to_space( x, self.scale, data_format="NCHW")) x = Subpixel_layer(inputs=x) x = self.reluAfterPixleShuffle(x) x = self.convOut(x) return x
Ошибка
/usr/src/app/generator.py:164 call * x = self.convOut(x) ValueError: Tensor's shape (3, 3, 64, 3) is not compatible with supplied shape (3, 3, 4, 3)
после прочтения ошибки я знаю, что (3, 3, 4, 3) (размер ядра, размер ядра, канал, вывод) означает, что только канал ввода неверен
поэтому я распечатал форму ввода
# after pixel shuffle before convOut print(x.shape) gt;gt;gt; (1, 4, 1440, 2560) (batch size, channel, height, width)
но форма x после pixel shuffle (depth_to_space)
(1, 4, 1440, 2560) значение канала равно 4, что соответствует convOut
потребности
вопрос в том, почему входной канал меняется с 4 на 64 в качестве ошибки?
Ответ №1:
Я нашел решение
Во-первых, я использую контрольные точки для экономии веса модели при обучении
во время внедрения и тестирования модели, я изменил некоторые слои, поэтому размер ввода тоже изменился, но мой вес все еще помнит размер ввода с предыдущей контрольной точки
поэтому я удаляю папку контрольных точек, а затем все снова работает