Python x的乙状结肠为1

Python x的乙状结肠为1,python,neural-network,sigmoid,Python,Neural Network,Sigmoid,我刚读了一本“制作你自己的神经网络”的书。现在我尝试用Python创建NeuralNetwork类。我使用乙状结肠激活功能。我编写了基本代码,并尝试对其进行测试。但是我的实现根本不能正常工作。经过长时间的调试并与书中的代码进行比较后,我发现非常大的数字的sigmoid是1,因为Python将它四舍五入。我使用numpy.random.rand()生成权重,该函数只返回0到1之间的值。把所有的重量和输入的乘积相加后,我得到了一个很大的数字。我用numpy.random.normal()函数修复了这

我刚读了一本“制作你自己的神经网络”的书。现在我尝试用Python创建NeuralNetwork类。我使用乙状结肠激活功能。我编写了基本代码,并尝试对其进行测试。但是我的实现根本不能正常工作。经过长时间的调试并与书中的代码进行比较后,我发现非常大的数字的sigmoid是1,因为Python将它四舍五入。我使用
numpy.random.rand()
生成权重,该函数只返回0到1之间的值。把所有的重量和输入的乘积相加后,我得到了一个很大的数字。我用
numpy.random.normal()
函数修复了这个问题,该函数从范围(-1,1)生成随机数。但我有一些问题

  • 乙状结肠是否具有良好的激活功能
  • 若节点的输出仍然很大,Python将结果舍入为1,这对于sigmoid来说是不可能的,那个么该怎么办
  • 如何防止Python对非常接近整数的浮点进行舍入
  • 作为神经网络(书籍、技术等)的初学者,有什么建议吗
  • 这个问题的答案显然取决于上下文。“好”是什么意思。sigmoid激活功能将产生介于0和1之间的输出。因此,它们是二进制分类的标准输出激活,您希望您的神经网络输出0到1之间的数字-输出被解释为您的输入在指定类中的概率。但是,如果在整个神经网络(即中间层)中使用乙状结肠激活函数,则可以考虑切换到激活函数。从历史上看,sigmoid激活函数在整个神经网络中被用作引入非线性的一种方法,因此神经网络可以做的不仅仅是近似线性函数。然而,人们发现乙状结肠激活严重地受到消失梯度问题的影响,因为函数远离0是平坦的。因此,如今,大多数中间层将使用RELU激活函数(或更奇特的东西,例如SELU/泄漏RELU/等)。对于小于0的输入,RELU激活函数为0,对于大于0的输入,RELU激活函数等于输入。它被发现足以将非线性引入神经网络

  • 一般来说,您不希望处于一个输出太大或太小以至于计算不稳定的状态。如前所述,帮助解决此问题的一种方法是使用不同的激活功能(如RELU)。帮助解决此问题的另一种方法,也许是更好的方法,是使用方案等更好地初始化权重,或者只是将其初始化为更小的值,例如在[-.01、.01]范围内。基本上,您可以调整随机初始化的规模,以使您的输出在一个良好的值范围内,而不是一些巨大或微小的数字。你当然也可以两者兼得

  • 您可以使用更高精度的浮点使python保留更多的小数。例如,您可以使用np.float64而不是np.float32…但是,这会增加计算复杂性,并且可能不是必需的。如今,大多数神经网络使用32位浮点运算,工作正常。请参见第1点和第2点,了解解决问题的更好方法

  • 这个问题太宽泛了。我认为Andrew Ng教授的课程和专业化是我学习神经网络方面的最有力的建议。

  • 您使用的是什么版本的python?你能给出一个最终将float转换为int的操作的例子吗?