【问题标题】:Python NumPy Array and Matrix MultiplicationPython NumPy 数组和矩阵乘法
【发布时间】:2019-12-06 20:59:55
【问题描述】:

我正在阅读“制作你自己的神经网络”一书,并通过示例来实现我的第一个 NN。我理解了基本概念,特别是这个等式,其中输出是通过输入和权重的矩阵点积来计算的:

X = W * I

其中 X 是应用 Sigmoid 之前的输出,W 是链接权重,I 是输入。

现在在本书中,他们确实有一个函数可以将此输入作为一个数组接收,然后他们将该数组转换为二维数组。我的理解是,X的值是这样计算的:

W = [0.1, 0.2, 0.3
     0.4, 0.5, 0.6
     0.7, 0.8, 0.9]

I = [1
     2
     3]

因此,如果我现在为我的输入(如 [1,2,3])传入一个数组,为什么我需要执行以下操作才能将其转换为 2-D 数组,就像书中所做的那样:

inputs = numpy.array(inputs, ndmin=2).T

有什么想法吗?

【问题讨论】:

  • 神经网络通常使用二维数组作为输入和输出,其基本思想是n 行代表观察,m 列代表特征。在您的情况下,您只有1 功能、您的输入(这也是您要预测的内容)和3 观察结果。换句话说,它更像是一种约定,恰好有助于理解您如何使用和存储数据。
  • 能否请您用答案和示例解释详细说明?
  • 恕我直言@TheHalf-BloodPrince 已经指出了所有相关的内容。也许另一点可能会有所帮助:通过断言 inputs 始终是二维的,您可以确保生成的点积 np.dot(W, I) 的方向始终是每个特征的列向量(每个自变量/组合等......都有其“自己的”行),与特征数量无关。菲对于n_features=1ndmin=1,你会从np.dot(W, I) 得到一个行向量,
  • 一方面不遵循约定,另一方面可能需要转置等,具体取决于下一步的算法。
  • 谢谢@Scotty1-!如果有帮助,我添加了一个带有进一步解释的答案和一个示例!

标签: python arrays neural-network


【解决方案1】:

您在这里的输入是一个一维列表(或一维数组):

I = [1, 2, 3]

这个一维数组背后的想法如下:如果这些数字代表花瓣的宽度(厘米)、长度和重量(克):你的花瓣将有1cm的宽度,a长度为2cm,权重为3g

将您的输入 I 转换为二维数组是必要的,因为有两件事:

  • 首先,默认情况下,使用numpy.array(inputs) 将此列表转换为 NumPy 数组将产生一个形状为 (3,) 的数组,第二维未定义。通过设置ndmin=2,它将维度强制为 (3, 1),这样就不会产生任何与 NumPy 相关的问题,例如在使用矩阵乘法时等。
  • 其次,也许更重要的是,正如我在评论中所说,神经网络中的数据通常以这种方式存储在数组中,其理念是数组中的每一行将代表不同的特征(因此有一个独特的 list)。换句话说,这只是一种传统方式来表示您不会混淆苹果和梨(在这​​种情况下,长度和重量)

因此,当您执行inputs = numpy.array(inputs, ndmin=2).T 时,您最终会得到:

array([[1],    # width
       [2],    # length
       [3]])   # weight

并且不是

array([1, 2, 3])

希望它能让事情变得更清楚一点!

【讨论】:

  • 我喜欢你的回答,因此投了赞成票,但它仍然存在错误:特征通常在第一维中,但在第二维中是 numpy(轴 = 1),样本在第二个但在第一个(axis = 0)中是numpy。因此,如果您的输入包含三个特征(而不是样本),它将是I = [[1], [2], [3]],导致inputsarray([[1, 2, 3]]),而三个样本I = [1, 2, 3] 将导致inputsarray([[1], [2], [3]]).
  • 很想对其进行编辑以添加一些说明,但现在结果令人困惑,因为我只添加了一半的编辑,然后才阻止我添加编辑...:D所以澄清一下:特征存储在(轴=1)中,而样本存储在(轴=0)中。
  • 也就是说,每一行代表一个特征?在上面的例子中,第一行代表一个由不同花瓣宽度组成的特征向量?我的理解正确吗?
  • 不,假设您有n_feats=2 功能和n_smpls=4 样本,那么inputs 将看起来像inputs = np.random.rand(n_smpls, n_feats)。这意味着,对于 4 个样本中的每一个,您都有 2 个特征,样本位于行中,特征位于列中。所以如果你选择inputs[2, :]你会得到第三个样本的特征,而inputs[:, 1]你会得到第二个特征的所有样本。
  • 好的,也就是说,输入将是一个 4*2 矩阵,包含 4 个样本和 2 个特征?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 2014-09-22
  • 2012-05-27
  • 2020-11-25
  • 1970-01-01
相关资源
最近更新 更多