张量流的第一个密集层中的 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 Input_shape 与Input_tensor