【问题标题】:input_shape error in first dense layer of tensoflow张量流的第一个密集层中的 input_shape 错误
【发布时间】: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 示例来提供它,我只想要两个数字作为输出。 有可能吗?
请帮忙!
谢谢!

【问题讨论】:

    标签: python-3.x tensorflow machine-learning keras keras-layer


    【解决方案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) 输出。
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多