Keras:大小为 x*x 的输入会生成不需要的输出 y*x
Keras: input with size x*x generates unwanted output y*x
我在 Keras 中有以下神经网络:
inp = layers.Input((3,))
#Middle layers omitted
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 的数组,另一个应该是一个普通值。相反,我得到一个 3x3 矩阵和一个包含 3 个元素的数组。我做错了什么?
您正在向网络传递三个输入样本:
>>> inpu.shape
(3,3) # three samples of size 3
你有两个输出层:其中一个输出每个样本大小为3的向量,另一个输出大小为1的向量(即标量),再次每个样本。因此,输出形状将是 (3, 3)
和 (3, 1)
.
更新: 如果您希望网络接受形状为 (3,3)
的输入样本并输出大小为 3 和 1 的向量,并且您只想使用 Dense网络中的层,则必须在模型中的某处使用 Flatten
层。一种可能的选择是在输入层之后立即使用它:
inp = layers.Input((3,3)) # don't forget to set the correct input shape
x = Flatten()(inp)
# pass x to other Dense layers
或者,您可以将数据展平为 (num_samples, 9)
的形状,然后在不使用 Flatten
层的情况下将其传递到您的网络。
更新 2: 正如@Mete 在评论中正确指出的那样,如果每个输入样本的形状为 (num_samples, 3, 3)
,请确保输入数组的形状为(3,3)
.
我在 Keras 中有以下神经网络:
inp = layers.Input((3,))
#Middle layers omitted
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 的数组,另一个应该是一个普通值。相反,我得到一个 3x3 矩阵和一个包含 3 个元素的数组。我做错了什么?
您正在向网络传递三个输入样本:
>>> inpu.shape
(3,3) # three samples of size 3
你有两个输出层:其中一个输出每个样本大小为3的向量,另一个输出大小为1的向量(即标量),再次每个样本。因此,输出形状将是 (3, 3)
和 (3, 1)
.
更新: 如果您希望网络接受形状为 (3,3)
的输入样本并输出大小为 3 和 1 的向量,并且您只想使用 Dense网络中的层,则必须在模型中的某处使用 Flatten
层。一种可能的选择是在输入层之后立即使用它:
inp = layers.Input((3,3)) # don't forget to set the correct input shape
x = Flatten()(inp)
# pass x to other Dense layers
或者,您可以将数据展平为 (num_samples, 9)
的形状,然后在不使用 Flatten
层的情况下将其传递到您的网络。
更新 2: 正如@Mete 在评论中正确指出的那样,如果每个输入样本的形状为 (num_samples, 3, 3)
,请确保输入数组的形状为(3,3)
.