一个顺序的Keras模型能否接受未展平的多维输入(如图像,即输入形状为每张图像MxN像素)?

我是一个Keras新手,正在尝试构建一个最简单的自编码器。它由三层组成:输入层、编码表示层和输出层。我的数据(训练和验证图像)是一个ndarray,其中每张图像的尺寸为214x214x3(像素 x 像素 x RGB通道)。我以为我可以直接在输入层中使用图像的输入形状,但不知为何我不断遇到错误。

我尝试过展平数据,这样做是可以的。当然我可以这样做,并重塑输出,但我很好奇为什么这样做不行。

# 单个图像的形状和大小
input_shape = x_tr.shape[1:] # --> (214, 214, 3)
input_size = x_tr[0].size
# 编码表示的大小
encoding_dim = 32
compression_factor = float(input_size / encoding_dim)
# 构建模型
autoencoder = Sequential()
autoencoder.add(Dense(encoding_dim, input_shape=input_shape,     activation='relu'))
autoencoder.add(Dense(input_shape, activation='softmax'))
input_img = Input(shape=(input_shape,))
encoder_layer = autoencoder.layers[0]
encoder = Model(input_img, encoder_layer(input_img))
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
autoencoder.fit(x_tr, x_tr,                epochs=50,                batch_size=32,                shuffle=True,                verbose=1,                validation_data=(x_va, x_va),                callbacks=[TensorBoard(log_dir='/tmp/autoencoder2')])

我得到了这个错误:

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

我认为它不期望输入形状看起来像那样,但我不知道如何修复它以接受214x214x3的形状而不是长度为137388的向量。


回答:

Dense 接受一个整数作为输入(神经元的数量),你提供了一个元组。尝试这样做:

output_dim = 214 * 214 * 3
autoencoder.add(Dense(output_dim, activation='softmax'))

你需要展平你的输入/输出,全连接的Dense层期望一个一维的输入/输出。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注