Neural network 编码神经网络中的偏差维数定义

Neural network 编码神经网络中的偏差维数定义,neural-network,pytorch,Neural Network,Pytorch,下图显示了定义偏差b1项维度的代码,我想知道为什么偏差b1的第一个维度不是批量大小?这是否意味着它只是假设该偏差适用于所有批次 如果我指定偏差b1维度为(批次大小,256),那么这是否意味着我将不同的b1应用于不同的批次?但从理论上讲,它应该仍然有效,对吗?张量(256),(256,)和(256,1)之间的区别是什么 您的神经网络层的权重和偏差是而不是根据批量大小指定的 例如:w1=torch.randn(784256): 这是一个2D矩阵,你将使用它进行矩阵乘法。 784是输入图像的尺寸,不考

下图显示了定义偏差b1项维度的代码,我想知道为什么偏差b1的第一个维度不是批量大小?这是否意味着它只是假设该偏差适用于所有批次

如果我指定偏差b1维度为(批次大小,256),那么这是否意味着我将不同的b1应用于不同的批次?但从理论上讲,它应该仍然有效,对吗?张量(256),(256,)和(256,1)之间的区别是什么


您的神经网络层的权重和偏差是而不是根据批量大小指定的

例如:
w1=torch.randn(784256)
: 这是一个2D矩阵,你将使用它进行矩阵乘法。 784是输入图像的尺寸,不考虑批量大小。(我猜这是针对mnist的?它看起来像是将2d图像展平为一维向量,所以28*28=784)

256是输出的输出维度(使用的登录数)

类似地,
b1=torch.randn(256)
: 这是一个1D向量,您刚刚添加到logits

256是logits的维度

Pytorch会自动在批处理维度上为您的所有操作广播(重复)这些内容,因此批处理大小是多少并不重要

例如,在添加中,b1在第一个维度上自动重复,因此添加的实际形状为(批次大小,256)

按照惯例,pytorch从右到左“对齐”尺寸

  • 如果缺少任何,则在缺少的维度上重复张量
  • 如果任何维度为1,它将在该维度上重复张量以匹配其他操作数。 例如(从广播文件中抄袭)
  • 这真的很方便,因为它意味着您不必每次使用不同的批处理大小时都重新定义您的神经网络


    张量(256),(256,)和(256,1)之间的区别是什么

    前两个完全相同;python通常允许在元组表达式中使用尾随逗号。您正在创建一个包含256个元素的一维向量

    最后一个是不同的;您正在创建二维张量,其中第一个维度为256,第二个维度为1。底层数据是相同的,只要您对使用的数据保持一致,这并不重要,但如果您将它们混合使用,通常会导致不希望的行为:

    例如:

    a=torch.randn(256)
    b=火炬。随机数(256)
    c=a+b
    c、 形状
    >>>火炬尺寸([256])
    
    简单:他们只是添加元素

    但请注意其中一个形状为(-1,1)时会发生什么:

    b=b.view(-1,1)#-1此处表示火炬将根据张量的已知大小和所有其他指定尺寸推断该尺寸的形状
    b、 形状
    >>>火炬尺寸([256,1])
    c=a+b
    
    现在因为广播规则

    • a在第一个维度上重复,因此它的维度数与b相同,因此它自动将a解释为张量(256256)
    • b被重复,因此它的最后一个维度(1)现在与a(256)的维度匹配
    因此:



    提示:广播规则可能很难记住,而且常常是bug的来源。当对张量形状有疑问时,在解释器中使用虚拟数据逐行运行代码并检查每个张量的形状是什么是值得的,例如
    print(torch.mm(input,w1.shape)

    欢迎使用Stackoverflow。如果可能,将图像内容作为代码块添加到帖子中。
    >>> x=torch.empty(5,7,3)
    >>> y=torch.empty(5,7,3)
    # same shapes are always broadcastable (i.e. the above rules always hold)
    
    >>> x=torch.empty((0,))
    >>> y=torch.empty(2,2)
    # x and y are not broadcastable, because x does not have at least 1 dimension
    
    # can line up trailing dimensions
    >>> x=torch.empty(5,3,4,1)
    >>> y=torch.empty(  3,1,1)
    # x and y are broadcastable.
    # 1st trailing dimension: both have size 1
    # 2nd trailing dimension: y has size 1
    # 3rd trailing dimension: x size == y size
    # 4th trailing dimension: y dimension doesn't exist
    
    # but:
    >>> x=torch.empty(5,2,4,1)
    >>> y=torch.empty(  3,1,1)
    # x and y are not broadcastable, because in the 3rd trailing dimension 2 != 3
    
    c.shape
    >>> torch.Size([256, 256])