神经网络用于图像识别时可能非常庞大。可能有成千上万的输入/隐藏神经元,数百万条连接,这会占用大量计算机资源。
虽然在C++中float通常为32位,double为64位,但它们在速度上没有太大的性能差异,但使用浮点数可以节省一些内存。
如果我们选择在神经网络中使用sigmoid作为激活函数,那么我们该如何选择变量是浮点数还是双精度浮点数,以便节省内存而不使神经网络无法正常工作?
虽然训练/测试数据的输入和输出肯定可以是浮点数,因为它们不需要双精度精度,因为图像中的颜色只能在0-255范围内,并且在归一化为0.0-1.0比例时,单位值将为1/255 = 0.0039〜
1. 对于隐藏神经元的输出精度,是否也可以将其设置为浮点数?
隐藏神经元的输出值是由前一层神经元的输出值乘以其与当前正在计算的神经元的连接权重之和得到的,然后将总和传递到激活函数(目前为sigmoid)中以获得新的输出值。总和变量本身可以是双精度浮点数,因为当网络很大时,它可能会变成一个非常大的数字。
虽然在C++中float通常为32位,double为64位,但它们在速度上没有太大的性能差异,但使用浮点数可以节省一些内存。
如果我们选择在神经网络中使用sigmoid作为激活函数,那么我们该如何选择变量是浮点数还是双精度浮点数,以便节省内存而不使神经网络无法正常工作?
虽然训练/测试数据的输入和输出肯定可以是浮点数,因为它们不需要双精度精度,因为图像中的颜色只能在0-255范围内,并且在归一化为0.0-1.0比例时,单位值将为1/255 = 0.0039〜
1. 对于隐藏神经元的输出精度,是否也可以将其设置为浮点数?
隐藏神经元的输出值是由前一层神经元的输出值乘以其与当前正在计算的神经元的连接权重之和得到的,然后将总和传递到激活函数(目前为sigmoid)中以获得新的输出值。总和变量本身可以是双精度浮点数,因为当网络很大时,它可能会变成一个非常大的数字。
2. 连接权重呢,它们可以是浮点数吗?
由于 Sigmoid 函数的存在,输入和神经元输出的范围在 0-1.0 之间,但是连接权重可以大于此范围。
随机梯度下降和反向传播因为激活函数的导数而受到梯度消失问题的影响。我决定不把这个问题放在梯度变量应该有多大精度的讨论中,因为我感觉浮点数在网络深度增加时可能不够精确。
float32
值。 - MSalters