张量流的第一个密集层中的 input_shape 错误

Posted

技术标签:

【中文标题】张量流的第一个密集层中的 input_shape 错误【英文标题】:input_shape error in first dense layer of tensoflow 【发布时间】:2021-08-07 13:14:28 【问题描述】:

我正在尝试创建一个模型,该模型采用 4 个元素的 python 列表并返回两个值作为预测。这是我的代码:

class DQNagent:

    def create_model(self):

        model = tf.keras.models.Sequential()
        model.add(tf.keras.layers.Dense(16, activation ='relu',input_shape =(4,1)))
        model.add(tf.keras.layers.Dense(32, activation ='relu'))
        model.add(tf.keras.layers.Dense(2, activation="linear"))
        model.compile(loss="mse", optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),metrics=['accuracy'])               
        return model

    def model_summary(self,model):
        return model.summary()

    def predict(self, state):
        return model.predict(state)

state = [ 0.02495595  0.04527366 -0.002845  0.04326009]
agent = DQNagent()
model = agent.create_model()
action = model.predict(state)
print(action)

此代码引发错误:

ValueError: Input 0 of layer sequential is incompatible with the layer: expected axis -1 of input shape to have value 4 but received input with shape (None, 1)

我已经给了input_shape=(4,1)。这是我给input_shape 的错误方式吗? 我该如何解决这个错误?

当我给出 input_shape = (1,4) 时,它仍然会抛出同样的错误。为什么会这样?我只有一个 state 示例来提供它,我只想要两个数字作为输出。 有可能吗? 请帮忙! 谢谢!

【问题讨论】:

【参考方案1】:

.predict(X) 期望批次是X 的第一个维度。在您的情况下,它会解释您的 4x1 数组,就像您提供了一批 4 个大小为 1 的示例一样。添加一个新维度以使其变为 1x4,因此它是一批 1,包含 4 个特征。

class DQNagent:

    def create_model(self):

        model = tf.keras.models.Sequential()
        model.add(tf.keras.layers.Dense(16, activation ='relu',input_shape=(4, )))
        model.add(tf.keras.layers.Dense(32, activation ='relu'))
        model.add(tf.keras.layers.Dense(8, activation="linear"))
        model.compile(loss="mse", optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),metrics=['accuracy'])               
        return model

    def model_summary(self,model):
        return model.summary()

    def predict(self, state):
        return model.predict(state)

state = [[ 0.02495595,  0.04527366, -0.002845,  0.04326009]]
agent = DQNagent()
model = agent.create_model()
action = model.predict(state)
print(action)

【讨论】:

那么输入的形状应该像 (1,)。我对么?为什么你在最后一个密集层放了 8 个单元?我只需要输出形状像 [a,b] 。你能澄清一下吗? @UjjawalM。您可以根据需要设置输入形状。我测试了上面的代码,它适用于最新版本的 tensorflow 我已经更新了我的评论,你能重新检查一下吗? 我只是将它用于测试目的,8 是完全随机选择的,在你的情况下它应该是动作空间的大小,你可以使用你想要的输出形状。在你的情况下 a 和 b 是什么? [a,b] = 两个元素的列表。即使我将 8 替换为 2,我也会得到 (4,2) 形状输出,但我想要 (1,2) 输出。

以上是关于张量流的第一个密集层中的 input_shape 错误的主要内容,如果未能解决你的问题,请参考以下文章

理解keras中的数据表示形式:张量

Keras Input_shape 与Input_tensor

自定义层中构建的继承 (super().build(input_shape))

Input_shape在自定义图层中为None

深度学习-Keras-层及损失函数

深度学习-Keras-层及损失函数