我是 Python 机器学习新手,我正在尝试调试在操作用于猜测游戏中字母的简单 DQN 模型的层大小和形状时遇到的错误。
states =
def build_model():
model = Sequential()
model.add(Dense(30, activation='relu', input_shape=(26,41)))
model.add(Dense(30, activation='relu'))
model.add(Dense(26, activation='linear'))
return model
model = build_model()
model.summary()
上面的代码给出了以下模型
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 26, 30) 1260
dense_2 (Dense) (None, 26, 30) 930
dense_3 (Dense) (None, 26, 26) 806
=================================================================
Total params: 2,996
Trainable params: 2,996
Non-trainable params: 0
_________________________________________________________________
但是运行模型会在终端中出现以下错误:
Model output "Tensor("dense_61/BiasAdd:0", shape=(None, 26, 26), dtype=float32)" has invalid shape. DQN expects a model that has one dimension for each action, in this case 26.
我看到我的最终密集层正在输出 (None, 26, 26),这导致了错误。使用 keras 的重塑图层,我可以将图层更改为 (None, 780, 1),这仍然不是我想要的。我的问题是,如果密集层没有结构,为什么密集层的输出形状是多维的而不是一维的,以及如何操作输出形状以返回一维向量?
Dense 实现操作:输出=激活(点(输入,内核)+偏差)
如果输入的维度为 (batch_size, d0, d1),那么我们创建一个形状为 (d1,units) 的内核,并且该内核沿输入的轴 2 对形状为 (1, 1, d1) 的每个子张量进行操作)(有batch_size * d0这样的子张量)。这种情况下的输出将具有形状(batch_size,d0,单位)。
在上面的代码中,当您传递实际数据时,None 将被替换为批量大小。摘要为您提供了整体情况,而无需实际传递任何数据。
例如,如果您有 100 张 26x24 图像,您的输入形状将为 (100, 26, 24)。您必须预处理数据,以便最终将其输入到构建的模型中。