Python 如何将sigmoid激活功能输出转换为0和1?

Python 如何将sigmoid激活功能输出转换为0和1?,python,keras,mnist,sigmoid,Python,Keras,Mnist,Sigmoid,我有以下数组: array([8.1837177e-05, 1.0788739e-03, 4.4837892e-03, 3.4919381e-04, 7.6085329e-05, 7.6562166e-05, 5.3864717e-04, 5.4001808e-04, 3.3849746e-02, 2.9903650e-04], dtype = float32) 我想将其转换为: array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0], dtype = float32)

我有以下数组:

array([8.1837177e-05, 1.0788739e-03, 4.4837892e-03, 3.4919381e-04, 7.6085329e-05, 7.6562166e-05, 5.3864717e-04, 5.4001808e-04,  3.3849746e-02, 2.9903650e-04], dtype = float32)
我想将其转换为:

array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0], dtype = float32)
我需要找到行的最大值,将其替换为1。然后,将该行的其他9个值替换为0


我需要对2D数组(一系列类似于示例中的数组)执行此操作。

使用
np。其中
max
结合使用:

a = np.array([8.1837177e-05, 1.0788739e-03, 4.4837892e-03, 3.4919381e-04, 7.6085329e-05, 7.6562166e-05, 5.3864717e-04, 5.4001808e-04,  3.3849746e-02, 2.9903650e-04])

np.where(a == a.max(), 1, 0)
输出:

array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0])
在2D情况下,我们取每行的最大值:

np.where(a == a.max(axis=1)[:, np.newaxis], 1, 0)

也就是说,我觉得keras应该有一些内置的东西来为你做这件事。

你可以使用如下列表:

x = [5,6,7,8,9]
y = [1 if num == max(x) else 0 for num in x]
x=数组([1,2,3,4])
x=np。其中(x==max(x),1,0)#将max替换为1,其他替换为0
这将产生:

array([0, 0, 0, 1])
对于二维阵列,可以执行以下操作:

x=array([[0,3,4,5],
[1, 2, 3, 1],
[6, 9, 1, 2]])
x=np.array([np.where(l==max(l),1,0)表示x中的l])
这将产生:

array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0]])`

  • 有关使用numpy.where的详细信息
  • 如果您愿意,可以在tensorflow中执行此操作

此方法需要两行代码,但它避免了将每个数组元素与max进行比较,并且在2D中效果良好。我不知道它是否真的会更快(当然不是渐进式的),但我认为两行代码比在python中为2D执行for循环要好,并且可读性可能比使用
np.where
要好

将numpy导入为np
#这是您的示例输入
#注意-即使只有一行,输入也必须是2D
#将其应用于1D情况很容易,但无论如何,您将使用2D阵列
class_probs=np.array([[
8.1837177e-05、1.0788739e-03、4.4837892e-03、3.4919381e-04、7.6085329e-05、,
7.6562166e-05、5.3864717e-04、5.4001808e-04、3.3849746e-02、2.9903650e-04、,
]])
pred_类=np.类零(类问题)
pred_类[范围(len(class_probs)),class_probs.argmax(-1)]=1
打印(pred_类)#[[0.0.0.0.0.0.0.0.0.1.0.]]
#这里显示的是同样的代码适用于多行
class_probs=np.rand.rand(100,10)
pred_类=np.类零(类问题)
pred_类[范围(len(class_probs)),class_probs.argmax(-1)]=1
pred_类

(这不是你真正的问题,但你是想使用sigmoid激活函数吗?而不是softmax?这里得到的输出不是10个可能类的单一分布(你可以看到它甚至没有标准化)。相反,你有10个分布,每个类一个(因此,输入为0类的概率为
8.1837177e-05
,而非0类的概率为
1-8.1837177e-05
)。这在进行多标签分类时是有意义的(其中可以应用多个标签),但您不希望找到概率最高的类,您应该预测概率高于阈值(例如0.5)的所有类。)

这是最优雅的方式谢谢你,但是数组是2D的。那么我如何才能让它工作?@gmds你的问题是关于numpy数组上的一个简单操作,你给我们提供了一些更详细的信息,这让我们很难阅读。我建议你尽可能简单。我从结果中知道它在numpy数组中是可行的,但我想知道是否有一个内置的keras激活函数,可以在不进行编码的情况下自行找到最大值。如果您的问题是keras函数是否会这样做,您应该这样说。但是,如果您有numpy数组,我不明白为什么您使用的函数来自keras还是numpy会有关系。