Tensorflowでnumber of input channels does not match corresponding dimension of filterのエラーが出ます
Tensorflowでプログラムを書いているのですが,
number of input channels does not match corresponding dimension of filter, 2 != 11
というエラーが出ています.
プログラムを以下に添付します.
def make_test(self):
inputs = Input(shape=(28, 28, 11), name='label')
x = Conv2D(64, (5, 5), padding='same')(inputs)
x = LeakyReLU()(x)
x = Conv2D(128, (5, 5), kernel_initializer='he_normal', strides=[2, 2])(x)
x = LeakyReLU()(x)
x = Conv2D(128, (5, 5), kernel_initializer='he_normal', padding='same', strides=[2, 2])(x)
x = LeakyReLU()(x)
x = Flatten()(x)
x = Dense(1024, kernel_initializer='he_normal')(x)
x = LeakyReLU()(x)
x = Dense(1, kernel_initializer='he_normal')(x)
model = Model(inputs=[inputs], outputs=[x])
return model
def make_hoge(self):
noise_shape = (110,)
inputs = Input(shape=noise_shape)
x = Dense(1024)(inputs)
x = LeakyReLU()(x)
x = Dense(128 * 7 * 7)(x)
x = BatchNormalization()(x)
x = LeakyReLU()(x)
if K.image_data_format() == 'channels_first':
x = Reshape((128, 7, 7), input_shape=(128 * 7 * 7,))(x)
bn_axis = 1
else:
x = Reshape((7, 7, 128), input_shape=(128 * 7 * 7,))(x)
bn_axis = -1
x = Conv2DTranspose(128, (5, 5), strides=2, padding='same')(x)
x = BatchNormalization(axis=bn_axis)(x)
x = LeakyReLU()(x)
x = Conv2D(64, (5, 5), padding='same')(x)
x = BatchNormalization(axis=bn_axis)(x)
x = LeakyReLU()(x)
x = Conv2DTranspose(64, (5, 5), strides=2, padding='same')(x)
x = BatchNormalization(axis=bn_axis)(x)
x = LeakyReLU()(x)
x = Conv2D(1, (5, 5), padding='same', activation='tanh')(x)
model = Model(inputs=[inputs], outputs=[x])
return model
def loss(self, y_true, y_pred):
return K.mean(y_true * y_pred)
def __init__():
self.test = self.make_test()
self.hoge = self.make_hoge()
for layer in self.test.layers:
layer.trainable = False
self.test.trainable = False
input_noise = Input(shape=(11,))
generated_images = self.hoge(input_noise)
input_label = Input(shape=(28, 28, 10,))
inputs = concatenate([generated_images, input_label], axis=3)
outputs = self.test(inputs)
self.train_model = Model(inputs=[input_noise, input_label], outputs=[outputs])
self.train_model.compile(optimizer=Adam(0.0001, beta_1=0.5, beta_2=0.9), loss=self.loss)
アルゴリズムの内容はGANです.変数名を短く書き直して上げたので間違っていたらすみません.
環境はpython2.7, tensorflow1.12です.
ちなみにinputs, generated_images, input_labelはshapeを出力するとそれぞれ(?,28,28,11), (?,?,?,1), (?,28,28,10)になっています.
generated_imagesをconcatenateせずにself.testに入れると動作することを確認しています.input_labelは動きませんでした.
conv層を消してみると動きます.
あと,エラー文が出ているのがtensorflowのnn_ops.pyの836行目付近なのですが,input_shape, filter_shape, num_spatial_dimsを出力してみると(?, 28, 28, 2), (5, 5, 11, 64), 2でした.filter_shape[num_spatial_dims]!=input_shape[num_spatial_dims+1]なのが問題のようです.
よろしくお願いいたします.