【发布时间】:2016-11-26 23:55:55
【问题描述】:
我正在使用Sigmoid 激活函数执行神经网络任务。我的网络输入是图像(MNIST 数据集),因为每个图像的维度是28*28,当我必须将它们转换为向量时,我将拥有N*784 矩阵。将这个大矩阵与权重矩阵相乘会产生大的权重正数和负数,我必须将它们传递给Sigmoid 函数。我使用expit() 作为 sigmoid 函数,我的问题是:
直到 30 的数字在 expit() 中接近 1。例如expit(28) 结果0.99999999 和expit(29) 结果1.0 和上29 也得到1。但是我的新人在30 较高,因此在第一个学习周期中他们中的一些人得到1 和一些0,实际上根本没有任何学习。
我必须做什么? Sigmoid's 上限是29?我不能改变它吗?我必须改变我的图像尺寸来克服这个问题?
【问题讨论】:
-
你使用的是哪个版本的 scipy? expit 在 0.14 (github.com/scipy/scipy/issues/3385) 之前数值不稳定
-
不知道,前两天我是通过pip安装的。
-
检查 python -c 'import scipy; print(scipy.__version__)' 我假设你使用的是 scipy 的 expit,对吧?
-
退出版本为:0.18.1。我的主要问题是,例如,当 1000*1000 numpy 矩阵相乘时,结果可能很大,而这些大数字对 sigmoid 函数没有用。我不知道我必须做什么。现在我将结果除以 1000 并使用它们。但我不知道有多合理和有效。似乎没有人在网络上遇到过这个问题!
-
您的问题是关于数值稳定性的,这就是我要回答的问题。但你是对的,sigmoid 在这种情况下不是很有用。这就是人们不使用它的原因,因此您在网上找到解决方案时遇到问题:)。改用交叉熵怎么样?使用 sigmoid,您将不可避免地在任何有限精度计算中遇到“1”。
标签: python matrix machine-learning neural-network sigmoid