密集层给我二维数组

Dense layer give me 2D array

我正在为 CartPole 进行强化学习,我遇到了这个问题

model = keras.models.Sequential()
model.add(Dense(8,activation = 'relu'))
model.add(Dense(2,activation = 'linear')

这是我的模型

state = env.reset()
print(state)


output:
[-0.00315391 -0.0150189   0.01804181  0.02032083]

这就是我得到的模型预测结果

model.predict(state)

output:
[[-0.00028523  0.00031606]
 [-0.00135828  0.00150507]
 [ 0.00500827 -0.01125371]
 [ 0.00564091 -0.01267526]]

为什么Dense(2,activation='linear')接收二维数组?

我期望输出具有 (2,1) 形状,但为什么模型接收的是 (2,4) 形状?

我发现输出在模型的输出节点和输入形状之间存在关系

您已提供 4 个输入,对于这些 4 个输入,模型预测 4 个输出。由于您的输出层有 2 个神经元,因此每个 4 个输出都有 2 个值。似乎一切都很好。并且输出形状是(4, 2)(不是(2, 4))。

如果您正在考虑它是如何算作 (4, 2),那么:要从左侧开始手动查找张量的形状,现在如果您在单个 [ 内输入,您将找到 4 1 dimensional tensors,因此类似地访问这些张量中的任何一个,你会再次找到 2 0 dimensional tensors(即 scalars)。由于您已达到 0 dimensional tensor,现在停止此过程。就是这样 (4, 2).

状态的形状是(4,),因此模型将其视为4个样本(第一维是样本数)。如果你想传递 1 个具有 4 个特征的样本,形状应该是 (1,4)(1 个样本,4 个特征),给你 (1,2)(1 个样本,2 个输出)。

这样传递:

model.predict(np.reshape(state,(1,-1)))

# output e.g.  
# array([[ 0.0078704 , -0.00879759]], dtype=float32) #(1,2)

请注意,您的模型应该使用具有 4 个特征的输入构建(例如 input_shape=(4,)),否则您会出错。如果您只是进行预测,运行 再次定义您的模型。