我是一个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层期望一个一维的输入/输出。