【发布时间】:2021-01-28 13:50:14
【问题描述】:
我正在制作一个神经网络,例如,当使用np.random.rand(797, 600) 分配随机权重值时,它们都变成了正数(从 0 到 1)。这通常很好,但我有多达 800 个节点,这意味着在初始前向传播结束时,如果所有权重都是正的,则 sigmoid 输出始终为 1,因为所有值的总和加起来如此之快,有这么多突触和节点。
为了解决这个问题,我想做一个函数,将每个权重随机乘以 1 或 -1。然后,使用随机数的正负数,输出将更接近 0,并且 sigmoid 函数将返回一个始终不是 1 的实际预测。这是我尝试过的两种方法,但都没有奏效。
# method 1
import random as rand
import numpy as np
def random_positive_or_negative(value):
return rand.choice([1, -1]) * value
example_weights = np.random.rand(4, 4)
print(random_positive_or_negative(example_weights))
打印类似这样的内容:
[[0.89098337 0.82291754 0.7730489 0.371631 ]
[0.22790221 0.19964653 0.94609767 0.57070762]
[0.35840034 0.06689964 0.71565062 0.43360395]
[0.57860037 0.11338668 0.338402 0.30737682]]
或者像这样:
[[-0.79750561 -0.94206793 -0.389792 -0.18541991]
[-0.36132547 -0.66040689 -0.06270979 -0.90775857]
[-0.22350726 -0.21148559 -0.78874412 -0.9702534 ]
[-0.74124928 -0.31675956 -0.97471565 -0.18389436]]
预期的输出是这样的:
[[0.2158195 0.16492544 0.25672823 -0.5392236 ]
[-0.54530676 0.98215902 -0.14348151 0.02629328]
[-0.8642513 -0.71726141 -0.15890395 -0.08488439]
[0.54413198 -0.69790104 0.05317512 -0.06144755]]
# method 2
import random as rand
import numpy as np
def random_positive_or_negative(value):
return (i * rand.choice([-1, 1]) for i in value)
example_weights = np.random.rand(4, 4)
print(random_positive_or_negative(example_weights))
打印这个:
<generator object random_positive_or_negative2.<locals>.<genexpr> at 0x114c474a0>
预期的输出是这样的:
[[0.2158195 0.16492544 0.25672823 -0.5392236 ]
[-0.54530676 0.98215902 -0.14348151 0.02629328]
[-0.8642513 -0.71726141 -0.15890395 -0.08488439]
[0.54413198 -0.69790104 0.05317512 -0.06144755]]
【问题讨论】:
-
创建一个大小相同的矩阵并随机填充1和-1,然后将2个矩阵相乘?
-
有什么理由不能只使用
np.random.uniform(-1., 1., size)? -
@xdurch0 非常感谢!我是 numpy 的新手,哈哈。那么,按照我给出的例子,我会通过
np.random.uniform(-1., 1., [797, 600])吗? -
是的。您可以查看文档here。
-
@xdurch0 是的,谢谢!我对其进行了测试,并且效果很好。绝对是给出的最佳答案。
标签: python python-3.x numpy random neural-network