【发布时间】:2019-10-19 15:48:35
【问题描述】:
我已经使用 keras 构建了一个 CNN 自动编码器,它适用于 MNIST 测试数据集。我现在正在尝试使用从另一个来源收集的不同数据集。有纯图像,我必须使用 cv2 阅读它们,它工作正常。然后,我将这些图像转换为一个 numpy 数组,我认为它也可以正常工作。但是当我尝试执行 .fit 方法时,它给了我这个错误。
Error when checking target: expected conv2d_39 to have shape (100, 100, 1) but got array with shape (100, 100, 3)
我尝试将图像转换为灰度,但它们得到的形状是 (100,100),而不是模型想要的 (100,100,1)。我在这里做错了什么?
这是我正在使用的代码:
def read_in_images(path):
images = []
for files in os.listdir(path):
img = cv2.imread(os.path.join(path, files))
if img is not None:
images.append(img)
return images
train_images = read_in_images(train_path)
test_images = read_in_images(test_path)
x_train = np.array(train_images)
x_test = np.array(test_images) # (36, 100, 100, 3)
input_img = Input(shape=(100,100,3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(168, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
autoencoder.fit(x_train, x_train,
epochs=25,
batch_size=128,
shuffle=True,
validation_data=(x_test, x_test),
callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])
该模型适用于 MNIST 数据集,但不适用于我自己的数据集。任何帮助将不胜感激。
【问题讨论】:
-
这里
input_img = Input(shape=(100,100,3))你已经提到了3通道,如果你得到这个错误,你的错误仍然是矛盾的。并将您的形状 (100,100) 转换为 (100,100,1) 使用numpy.expand_dims。 -
我稍微更改了代码,现在我从 cv2 读取灰度图像。并做了 np.expand(x_train, axis=3) 得到 (36, 100, 100, 1) 但模型什么也没做。它运行但损失是损失:-3104.3462 - val_loss:-2954.8867。我原来的自动编码器给了我这个 - loss: 0.1052 - val_loss: 0.1038 for MNIST
-
我也尝试过在将数组放入 Input() 之前将其展平
-
您的输入和输出形状不同,自动编码器不应该是这种情况。
标签: python opencv keras deep-learning conv-neural-network