Flatten层输入不兼容问题求助(Keras2.1.4+TensorFlow1.5)
解决Keras 2.1.4中Flatten层维度不兼容的问题
这个错误是因为你使用的Keras 2.1.4(搭配TensorFlow 1.5)版本中,Flatten层对输入维度的要求和新版本不同——它默认期望输入至少是3维(比如批量维度+两个空间维度,或者批量+特征+单通道这类结构),但你的输入是2维数组(3280977, 400)(样本数×单样本特征数),所以触发了维度不匹配的报错。
这里有两个直接有效的解决方案:
方案一:移除不必要的Flatten层
你的输入已经是扁平的400维向量,完全不需要用Flatten层来展平。直接把Flatten层去掉,让Dense层直接接收2D输入即可:
def train_model(): autoencoder = keras.Sequential([ # 直接给Dense层指定input_shape=[400],接收2D输入 keras.layers.Dense(150, name='bottleneck', input_shape=[400]), keras.layers.Dense(400, activation='sigmoid') ]) autoencoder.compile(optimizer='adam', loss='mse') return autoencoder
这是最简洁的解决方式,因为Dense层本身就支持处理(样本数, 特征数)格式的2D输入。
方案二:保留Flatten层,调整输入维度
如果你因为代码结构等原因一定要保留Flatten层,可以给输入数组手动增加一个维度,把2D数据转成3D,同时调整Flatten层的input_shape:
# 给test_set增加一个最后维度,变成(3280977, 400, 1) test_set = np.expand_dims(test_set, axis=-1) # 修改模型中的Flatten层input_shape为[400, 1] def train_model(): autoencoder = keras.Sequential([ keras.layers.Flatten(input_shape=[400, 1]), keras.layers.Dense(150, name='bottleneck'), keras.layers.Dense(400, activation='sigmoid') ]) autoencoder.compile(optimizer='adam', loss='mse') return autoencoder
这样输入变成3维后,就符合旧版本Flatten层的要求了,展平后依然会得到400维的特征向量,后续的Dense层可以正常处理。
补充说明
在较新的Keras版本中,Flatten层已经支持直接处理2D输入,但在你使用的2.1.4这个早期版本里,它的设计更偏向处理图像类的高维输入,所以对2D输入的兼容性较差。优先推荐方案一,既简化代码又避免不必要的维度转换。
内容的提问来源于stack exchange,提问作者Anshul Dubey
相关产品推荐
相关产品推荐

