【问题标题】:Python numpy computing out matrix with shape 3,3,3 from input matrecies with shape 3,3Python numpy 从形状为 3,3 的输入矩阵中计算出形状为 3,3,3 的矩阵
【发布时间】:2021-11-12 23:42:49
【问题描述】:

我目前仅使用 numpy 在 python 中构建 NeuralNetwork。

这是问题区域的布局:

我有一个数组在列中保存输入神经元的值,行代表不同的训练数据点。它的形状是 3、3:

in_a
array([['t_1a_1', 't_1a_2', 't_1a_3'],
       ['t_2a_1', 't_2a_2', 't_2a_3'],
       ['t_3a_1', 't_3a_2', 't_3a_3']], dtype='<U6')

然后我有一个权重数组,其中列是到输出 1、2 和 3 的连接,行是从 1、2 和 3 开始的连接。它还具有形状 3、3:

in_w
array([['w_11', 'w_12', 'w_13'],
       ['w_21', 'w_22', 'w_23'],
       ['w_31', 'w_32', 'w_33']], dtype='<U4')

现在我想计算一个形状为 3、3、3 的矩阵。如下所示:

out
array([[['t_1*a_1*w_11', 't_1*a_1*w_12', 't_1*a_1*w_13'],
        ['t_1*a_2*w_21', 't_1*a_2*w_22', 't_1*a_2*w_23'],
        ['t_1*a_3*w_31', 't_1*a_2*w_32', 't_1*a_2*w_33']],

       [['t_2*a_1*w_11', 't_2*a_1*w_12', 't_2*a_1*w_13'],
        ['t_2*a_2*w_21', 't_2*a_2*w_22', 't_2*a_2*w_23'],
        ['t_2*a_3*w_31', 't_2*a_2*w_32', 't_2*a_2*w_33']],

       [['t_3*a_1*w_11', 't_3*a_1*w_12', 't_3*a_1*w_13'],
        ['t_3*a_2*w_21', 't_3*a_2*w_22', 't_3*a_2*w_23'],
        ['t_3*a_3*w_31', 't_3*a_2*w_32', 't_3*a_3*w_33']]], dtype='<U12')

我尝试了 numpy.dot、简单的 * 乘法、@ 组合,但没有任何效果。我认为解决方案可能是 numpy.einsum 或 numpy.tensordot 但我无法绕过它们。有人知道如何根据输入矩阵计算输出矩阵,或者可以推荐一种方法和解释吗?谢谢你的帮助

【问题讨论】:

  • 看起来像一个外部产品,可以用broadcasting 完成。这不是 dot 所做的乘积之和。
  • 我试过 np.outer(in_a, in_w) 但这给了我一个大小为 81 的数组太大了,我想我需要一个可以将三个变量 t a 和 w 相乘的函数。您认为广播对此有何帮助?
  • 我在上面的所有索引中都迷失了。你能告诉我out[i, j, k] 的值是多少in_ain_w。我怀疑你只是需要in_a[:,:,None] * in_w[None,:,:] 之类的东西,但我有点不确定正在广播哪些维度,而且我可能将 Nones 放在错误的位置。
  • 你的变量不应该是字符串
  • np.outer 不够通用。在尝试使用它之前阅读其文档是个好主意。

标签: python arrays numpy numpy-einsum


【解决方案1】:

你只需要

in_a[...,None] * in_w

如果您考虑一下 in_a 的形状 (training_sets, input_neurons)in_w (input_neurons, output_neurons)。而且您的输出似乎是

的元素乘法
    (T, I)       # in_a
*      (I, O)    # in_w

让我们来看看这个有趣的东西

class Variable:
    def __init__(self, name):
        self.name = name

    def __mul__(self, other):
        if not isinstance(other, Variable):
            raise ValueError
        return Variable(f'{self.name}*{other.name}')

    def __repr__(self):
        return self.name


def generate_array(fmt, rows, columns):
    return np.array([[Variable(fmt.format(i, j)) for j in range(1, columns+1)] 
                     for i in range(1, rows+1)])

in_a = generate_array('t_{}a_{}', 3, 3)
in_w = generate_array('ww_{}{}', 3, 3)
print(in_a[...,None] * in_w)

打印出来的

[[[t_1a_1*ww_11 t_1a_1*ww_12 t_1a_1*ww_13]
  [t_1a_2*ww_21 t_1a_2*ww_22 t_1a_2*ww_23]
  [t_1a_3*ww_31 t_1a_3*ww_32 t_1a_3*ww_33]]

 [[t_2a_1*ww_11 t_2a_1*ww_12 t_2a_1*ww_13]
  [t_2a_2*ww_21 t_2a_2*ww_22 t_2a_2*ww_23]
  [t_2a_3*ww_31 t_2a_3*ww_32 t_2a_3*ww_33]]

 [[t_3a_1*ww_11 t_3a_1*ww_12 t_3a_1*ww_13]
  [t_3a_2*ww_21 t_3a_2*ww_22 t_3a_2*ww_23]
  [t_3a_3*ww_31 t_3a_3*ww_32 t_3a_3*ww_33]]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2013-08-17
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多