【已修复】Error: ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`

Keras框架

我们需要记住的一件事情是,Dense层要求明确上一层输出的第二维度的值,而不能显示为None。
但是这种“明确”似乎并不能通过在Dense层指定input_shape就可以实现的。

x1_in = Input(shape=(None,))
x2_in = Input(shape=(None,))
x = SelfCreateLayer([x1_in, x2_in])
# 这里的SelfCreateLayer它输入其实是两个shape为(batch,120)的tensor对象。但是因为120是由dataset决定的,因此这里将其设计为None以自适应各个shape的张量。
output = keras.layers.Bidirectional(keras.layers.LSTM(units=128, return_sequences=True))(x)
# 双向LSTM,输出为(None,None,256)
T = SelfCreateLayer2()(output)
# SelfCreateLayer2,输出为(None,None,256)
T = GlobalMaxPooling1D()(T)
# 若是使用flatten/Reshape,则无法进行实验,显示错误:Error: ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`。
# 解决方法就是,使用池化层代替flatten或者reshape。

output = Dense(10, activation="softmax")(T)
model = Model([x1_in, x2_in], output)

正如上面代码所展示的那样:

T = GlobalMaxPooling1D()(T)
# 若是使用flatten/Reshape,则无法进行实验,显示错误:Error: ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`。
# 解决方法就是,使用池化层代替flatten或者reshape。
output = Dense(10, activation="softmax")(T)

这只是一种方案,而且方案的要点其实是两个部分,第一是GlobalMaxPooling1D代替Flatten,第二是input不能指定具体的维度,只能使用None,如果使用具体的值,会产生SelfCreateLayer部分的问题。因为SelfCreateLayer是自己创建的层,因此如果是其他的层,可能不会出现跟我代码中一样的问题。

因此本文只是提供一种解决思路:无论何种原因,使得Dense层的输入张量的第二维度为(none, none, features)时,如果使用Flatten出现了本文题目的问题,那么可以尝试使用池化层API替换解决。

参考文章:Error: ValueError: The last dimension of the inputs to Dense should be defined. Found None

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值