【问题标题】:Is there a way to make the numbers in a numpy array randomly positive or negative?有没有办法让 numpy 数组中的数字随机为正或负?
【发布时间】: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


【解决方案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]]

【讨论】:

  • 这确实有效,但我将使用np.random.uniform(-1., 1., size),因为它非常干净。谢谢你的回答!
【解决方案2】:

您的第一个方法选择一个数字,1 或 -1,并将整个参数数组乘以该数字。您的第二种方法使用生成器表达式,因此它将返回一个生成器。如果你不明白这一点,你应该先阅读生成器。

没有必要将任何值乘以 1,因为这没有任何作用。相反,选择随机索引并将它们乘以 -1。比如:

 n = example_weights.size
 inds = np.random.choice(n, n, replace=False)
 example_weights.flat[inds] *= -1

【讨论】:

  • 这确实有效,但我将使用np.random.uniform(-1., 1., size),因为它非常干净。谢谢你的回答!
【解决方案3】:

有几种方法可以做到这一点,但在我看来,@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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多