有没有一种方法可以使numpy数组中的数字随机为正或为负?

时间:2020-10-14 07:27:41

标签: python python-3.x numpy random neural-network

我正在建立一个神经网络,例如,当使用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]]

3 个答案:

答案 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]]