我正在建立一个神经网络,例如,当使用np.random.rand(797, 600)
分配随机权重值时,它们的结果都是正数(从0到1)。通常这很好,但是我有多达800个节点,这意味着到初始正向传播结束时,如果所有权重均为正,则S形输出始终为1,这是因为所有值的总和与这么多的突触相加得如此之快和节点。
为解决此问题,我想制作一个函数,将每个权重随机乘以1或-1。然后,使用正数和负数的随机数,输出将接近于0,并且S型函数将返回始终不是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]]
答案 0 :(得分:1)
您可以创建一个矩阵,该矩阵由从Universe [-1,1]中采样的随机数填充,并将其与随机权重相乘。参见下面的代码
import random as rand
import numpy as np
def random_positive_or_negative(value):
return np.matmul(value, np.random.choice(np.array([-1, 1]), value.shape))
example_weights = np.random.rand(4, 4)
print(random_positive_or_negative(example_weights))
[[-0.7193314 -0.1604493 -0.47038437 -0.34173619]
[ 0.44388733 -0.55476039 -1.24586476 -0.77014132]
[-0.05796445 -1.72406933 -1.5756221 -0.18125272]
[ 0.15338058 -0.56916866 -1.5706919 -0.01815559]]
答案 1 :(得分:1)
您的第一个方法选择一个数字1或-1,然后将整个参数数组乘以该数字。第二种方法使用生成器表达式,因此它将返回生成器。如果您不了解这一点,则应先阅读有关发电机的信息。
无需将任何值乘以1,因为这不会执行任何操作。相反,选择随机索引并将它们乘以-1。像这样:
n = example_weights.size
inds = np.random.choice(n, n, replace=False)
example_weights.flat[inds] *= -1
答案 2 :(得分:0)
有几种方法可以做到,但是我认为@ xdurch0提出了最流畅的建议:使用np.random.uniform(-1., 1., size)
这是代码的工作方式:
import numpy as np
example_weights = np.random.uniform(-1., 1., [4, 4])
print(example_weights)
打印类似:
[[-0.91852112 -0.77686616 -0.41495832 0.78950649]
[-0.7493404 -0.73794508 0.54622202 -0.89033855]
[ 0.31196172 0.06584705 -0.88698673 -0.24149299]
[-0.89654412 0.45450007 -0.40640681 0.81490564]]