我正在为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')
接收2D阵列?
我期望输出(2,1)形状,但为什么模型接收(2,4)形状?
我发现输出在模型的输出节点和输入形状之间有关系
状态的形状为(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,)
)的输入来构建,否则你会得到错误。如果你只是在做预测,再次运行你的模型定义。
您已经给出了4
输入,并且对于这些4
输入,模型正在预测4
输出。由于输出层有2
个神经元,因此,每个4
输出都有2
的值。似乎一切都很好。输出形状为(4, 2)
(不是(2, 4)
)。
如果你在想它是如何被算作(4, 2)
的,那么:手动从左边开始寻找张量的形状,现在如果你进入一个单独的[
,你会找到4
1 dimensional tensor
s,因此同样地进入任何这些张量,你会再次找到2
0 dimensional tensor
s(即scalar
s),当你到达0 dimensional tensor
时,现在停止这个过程。这是(4, 2)
.