我有一个包含 32 个输入节点、20 个隐藏节点和 65 个输出节点的网络。 我的网络输入实际上是长度为 32 的哈希码,输出是单词。
输入是Hash中每个字符的ascii值除以256。
网络的输出是我制作的二进制表示。例如,a 等于 00000,b 等于 00001,依此类推。它只包含字母表和空格,因此每个字符只有 5 位。我的训练输入最多只能输入 13 个字符。所以我的输出节点是 13 * 5 = 65。我期待像 10101010101010101010101010101010101010101010101010101010101001011
这样的二进制输出。给定 32 长度的哈希码作为输入,位序列最多可以预测 16 个字符的单词。
model = Sequential([
Dense(32, input_shape=(32,), activation = 'relu'),
Dense(20, activation='relu'),
Dense(65, input_shape=(65,), activation='softmax')
])
model.summary()
model.compile(Adam(lr=.001), loss='binary_crossentropy', metrics= ['accuracy'])
model.fit(train_samples, train_labels, batch_size=1000, epochs=10000,shuffle = True, verbose=2)
当我尝试使用下面的代码进行预测时:
clf.predict(X)
它总是输出小于 0.5 的小十进制值。
[[8.95109400e-03 1.11340620e-02 1.27389077e-02 1.90807953e-02
1.56925414e-02 7.47500360e-03 1.30378362e-02 1.67052317e-02
1.07944654e-02 9.68935993e-03 9.82633699e-03 1.29385451e-02
1.56633276e-02 1.38113154e-02 1.50949452e-02 8.81231762e-03
1.26177669e-02 1.46279763e-02 1.42763760e-02 1.31389238e-02
8.32264405e-03 1.52036361e-02 1.52883027e-02 1.47563582e-02
1.19247697e-02 1.16073946e-02 1.72672570e-02 1.35995271e-02
1.77132934e-02 1.33292647e-02 1.41840307e-02 1.78522542e-02
9.77656059e-03 1.82192177e-02 9.86329466e-03 1.62205566e-02
1.95278302e-02 9.18696448e-03 2.06225738e-02 1.01496875e-02
2.08229423e-02 2.36334335e-02 6.02523983e-03 2.36746706e-02
6.56269025e-03 2.44314633e-02 2.70614270e-02 4.14136378e-03
2.72923186e-02 3.86772421e-03 2.90246904e-02 2.92722285e-02
3.06371972e-03 2.97660977e-02 1.89558265e-03 3.17853205e-02
3.13901827e-02 1.13886443e-03 3.24600078e-02 1.15508994e-03
3.36604454e-02 3.36041413e-02 4.59054590e-08 3.35478485e-02
4.63940282e-08]]
我期待一个二进制输出。我如何获得所需的二进制值?我尝试过在接近 0 时将其近似为 0 ,在接近 1 时将其近似为 1 。对吗?如果是这样,那么我的输出总是0,因为所有的都接近0。我认为这是不对的。请帮忙。
最佳答案
您的激活函数可能存在误解。
softmax
是为“一个正确的类别”设计的,而不是为 65 个可能正确的类别设计的。
softmax 结果的总和将始终为 1,因此您实际上可能不会有任何高于 0.5 的东西。
使用sigmoid
激活。
关于python - 如何将 Keras 预测输出转换为所需的二进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53482251/