橘子树枝 2024-03-12 09:26 采纳率: 16.7%
浏览 3

神经网络的输入参数x为什么是这样(语言-python)

# 前向传播函数
# - x:包含输入数据的numpy数组,形状为(N,d_1,...,d_k)
# - w:形状为(D,M)的一系列权重
# - b:偏置,形状为(M,)
def affine_forward(x, w, b):   
    out = None                       # 初始化返回值为None
    N = x.shape[0]                   # 重置输入参数X的形状
    x_row = x.reshape(N, -1)         # (N,D)
    out = np.dot(x_row, w) + b       # (N,M)
    cache = (x, w, b)                # 缓存值,反向传播时使用
    return out,cache

在某些应用场景中,x的维度可能更高。比如对于一个2020像素的4张灰度图,x的形状将是(4,20,20),对应的参数就是N=4,d_1=20,d_2=20。(这里边第一个参数用N表示,它代表的是同时用于计算前向传播的数据有几组,后边的参数d_1~d_k代表的是数据本身的形状。)
对于这种维度大于2的x来说,需要对其进行重新塑形,也就是将(4,20,20)的高维数组变化为(4,20
20)这样的二位数组。为什么要这么做呢?是为了方便计算。这样变换之后高维的向量被“拍扁”成一维向量(长度为20*20的一维向量),对应的W和b也都是一维的,既统一了参数形式,又不会影响数据的正常使用。

我的理解是N就是数据的数量,不同的数据有不同的规格,每个数据的具体样式则是d_1,d_2,d_k决定的。如果有四个数据,数据本身就是20行20列的,那么x的形状应该写作(4,20,20)。照这样说,如果有四个数据,每个数据是一行两列的,x的形状为什么不是(4,1,2)而是(4,2)呢?1可以省略不写吗?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-12 09:26
    关注

    引自免费微信小程序:皆我百晓生

    在神经网络中,输入参数x的形状会根据实际应用的数据结构来设计。你对N和d_1、d_2、d_k的理解是正确的。N确实代表了批量数据的数量,而d_1、d_2等维度则对应了单个数据样本的空间维度。

    对于你的问题,当有四个数据,每个数据是一行两列(即二维向量)时,x的正确形状应该是(4, 2)。这里之所以不需要写成(4, 1, 2),是因为在神经网络处理这类数据时,通常将每个独立的数据样本看作一个一维数组,即使它原本在逻辑上是二维的。在这种情况下,我们直接将每行两列的数据视为一个长度为2的一维向量,因此第二维度就直接写成了2,省略了不包含信息的1维。

    例如,如果有四个这样的数据样本,可以表示为:

    [
      [a1, a2],
      [b1, b2],
      [c1, c2],
      [d1, d2]
    ]
    

    这个列表会被转换为形状为(4, 2)的numpy数组,其中每一行对应一个样本,每一列代表样本的一个特征值。

    在上述代码affine_forward函数中,reshape操作就是为了将可能的高维数据展平为一维,以便进行矩阵乘法运算。这是因为权重w是一个二维数组,需要与展平后的输入向量进行点积运算。所以,无论原始输入数据有多少维,最终都需要将其变形成能够与权重矩阵相乘的形式。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月12日

悬赏问题

  • ¥15 内网办公电脑进行向日葵
  • ¥15 如何输入双曲线的参数a然后画出双曲线?我输入处理函数加上后就没有用了,不知道怎么回事去掉后双曲线可以画出来
  • ¥50 WPF Lidgren.Network.Core2连接问题
  • ¥15 soildworks装配体的尺寸问题
  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建