ValueError:检查目标时出错:预期 model_2 的形状为 (None, 252, 252, 1) 但得到的数组的形状为 (300, 128, 128, 3)

Posted

技术标签:

【中文标题】ValueError:检查目标时出错:预期 model_2 的形状为 (None, 252, 252, 1) 但得到的数组的形状为 (300, 128, 128, 3)【英文标题】:ValueError: Error when checking target: expected model_2 to have shape (None, 252, 252, 1) but got array with shape (300, 128, 128, 3) 【发布时间】:2018-05-30 06:55:56 【问题描述】:

您好,我正在为一类分类构建图像分类器,在该分类器中我在运行此模型时使用了自动编码器,我在这一行收到此错误 (autoencoder_model.fit) (ValueError: Error when checks target: expected model_2 to有形状 (None, 252, 252, 1) 但得到了形状 (300, 128, 128, 3) 的数组。)

num_of_samples = img_data.shape[0]
labels = np.ones((num_of_samples,),dtype='int64')



labels[0:376]=0 
names = ['cats']


input_shape=img_data[0].shape



X_train, X_test = train_test_split(img_data, test_size=0.2, random_state=2)


inputTensor = Input(input_shape)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(inputTensor)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded_data = MaxPooling2D((2, 2), padding='same')(x)

encoder_model = Model(inputTensor,encoded_data)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional
encoded_input = Input((4,4,8))
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded_input)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu',padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded_data = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

decoder_model = Model(encoded_input,decoded_data)

autoencoder_input = Input(input_shape)
encoded = encoder_model(autoencoder_input)
decoded = decoder_model(encoded)
autoencoder_model = Model(autoencoder_input, decoded)
autoencoder_model.compile(optimizer='adadelta', 
 `enter code here`loss='binary_crossentropy')


autoencoder_model.fit(X_train, X_train,
            epochs=50,
            batch_size=32,
            validation_data=(X_test, X_test),
            callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

【问题讨论】:

您希望您的图片尺寸是多少?您可以打印input_shapeimg_data.shape 并检查您的期望。检查它是否与autoencoder_model.summary() 匹配 我按照你的建议做我会告诉你的 input_shape -(128, 128, 3) , img_data.shape - (376, 128, 128, 3) autoencoder_model.summary()- 层(类型)输出形状参数# input_3 (InputLayer) (None, 128, 128, 3) 0 model_1 (Model) (None, 32, 32, 8) 2192 model_2(模型)多个 2481 总参数:4,673 可训练参数:4,673 不可训练参数:0 你有encoder_model = Model(inputTensor,encoded_data), decoder_model = Model(encoded_input,decoded_data), .. 行吗?看起来很像您尝试遵循示例 here,它不包含这些行,并且有效。 【参考方案1】:

这是解码器的输出形状与您的训练数据形状之间的简单不兼容。 (目标表示输出)。

我看到您有 2 个 MaxPoolings(将您的图像大小除以 4)和三个上采样(将解码器的输入乘以 8)。

自动编码器的最终输出太大,与您的数据不匹配。您必须简单地在模型中工作以使输出形状与您的训练数据相匹配。

【讨论】:

【参考方案2】:

你使用了错误的 API

autoencoder_model.fit(X_train, X_train,  <--- This one is wrong
        epochs=50,
        batch_size=32,
        validation_data=(X_test, X_test),
        callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

看看 .fit 方法源代码 来自https://github.com/keras-team/keras/blob/master/keras/models.py

def fit(self,
        x=None,
        y=None,
        batch_size=None,
        epochs=1,
        verbose=1,
        callbacks=None,
        validation_split=0.,
        validation_data=None,
        shuffle=True,
        class_weight=None,
        sample_weight=None,
        initial_epoch=0,
        steps_per_epoch=None,
        validation_steps=None,
        **kwargs):
    """Trains the model for a fixed number of epochs (iterations on a dataset).
    # Arguments
        x: Numpy array of training data.
            If the input layer in the model is named, you can also pass a
            dictionary mapping the input name to a Numpy array.
            `x` can be `None` (default) if feeding from
            framework-native tensors (e.g. TensorFlow data tensors).
        y: Numpy array of target (label) data.
            If the output layer in the model is named, you can also pass a
            dictionary mapping the output name to a Numpy array.
            `y` can be `None` (default) if feeding from
            framework-native tensors (e.g. TensorFlow data tensors).

所以 x 应该是数据,y 应该是数据的标签。 希望有所帮助

【讨论】:

以上是关于ValueError:检查目标时出错:预期 model_2 的形状为 (None, 252, 252, 1) 但得到的数组的形状为 (300, 128, 128, 3)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:检查目标时出错:预期activation_6 的形状为(70,)但得到的数组形状为(71,)

ValueError:检查目标时出错:预期dense_4的形状为(4,)但得到的数组形状为(1,)

ValueError:检查目标时出错:预期dense_3的形状为(1,)但得到的数组形状为(2,)

ValueError:检查目标时出错:预期activation_6具有形状(无,2)但得到的数组具有形状(5760,1)

ValueError:检查目标时出错:预期 activation_17 具有 2 维,但得到的数组形状为 (1, 256, 256, 3)

ValueError:检查目标时出错:预期 main_prediction 有 3 个维度,但得到了形状为 (1128, 1) 的数组