Тензорный поток — несовместимая форма с conv2d после глубины в пространстве

#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:

Я нашел решение

Во-первых, я использую контрольные точки для экономии веса модели при обучении
во время внедрения и тестирования модели, я изменил некоторые слои, поэтому размер ввода тоже изменился, но мой вес все еще помнит размер ввода с предыдущей контрольной точки

поэтому я удаляю папку контрольных точек, а затем все снова работает