我在Keras中构建了以下神经网络:
inp = layers.Input((3,))#中间层已省略out_prop = layers.Dense(units=3, activation='softmax')(inp)out_value = layers.Dense(units=1, activation = 'linear')(inp)
然后我准备了一个伪输入来测试我的网络:
inpu = np.array([[1,2,3],[4,5,6],[7,8,9]])
当我尝试预测时,发生了以下情况:
In [45]:nn.network.predict(inpu)Out[45]: [array([[0.257513 , 0.41672954, 0.32575747], [0.20175152, 0.4763418 , 0.32190666], [0.15986516, 0.53449154, 0.30564335]], dtype=float32),array([[-0.24281949], [-0.10461146], [ 0.11201331]], dtype=float32)]
如上所示,我希望有两个输出:一个应该是大小为3的数组,另一个应该是普通数值。但实际上,我得到的是一个3×3的矩阵和一个包含3个元素的数组。我做错了什么?
回答:
你向网络传递了三个输入样本:
>>> inpu.shape(3,3) # 三组大小为3的样本
你有两个输出层:其中一个输出每个样本的大小为3的向量,另一个输出每个样本的大小为1的向量(即标量)。因此,输出形状将是(3, 3)
和(3, 1)
。
更新: 如果你希望你的网络接受形状为(3,3)
的输入样本,并输出大小为3和1的向量,并且你只想在网络中使用Dense层,那么你必须在模型中的某个地方使用Flatten
层。一个可能的选项是在输入层之后立即使用它:
inp = layers.Input((3,3)) # 别忘了设置正确的输入形状x = Flatten()(inp)# 将x传递给其他Dense层
或者,你可以将数据展平为形状(num_samples, 9)
,然后在不使用Flatten
层的情况下将其传递给你的网络。
更新2: 正如@***在评论中正确指出的,如果每个输入样本的形状为(3,3)
,请确保输入数组的形状为(num_samples, 3, 3)
。