PyTorch广播:这是如何工作的?

时间:2019-07-09 14:38:56

标签: python machine-learning pytorch

我是深度学习的新手。我正在从Udacity学习。

我碰到了其中一个代码,以建立一个神经网络,其中添加了2个张量,特别是带有张量乘积输出的'bias'张量。

有点...

def activation(x):
return (1/(1+torch.exp(-x)))

inputs = images.view(images.shape[0], -1)
w1 = torch.randn(784, 256)
b1 = torch.randn(256)
h = activation(torch.mm(inputs,w1) + b1)

将MNIST展平后,其结果为[64,784](输入)。

我不知道如何将尺寸为[256]的偏置张量(b1)添加到'inputs'和'w1'的乘积中,得出的结果为[256,64]的尺寸。

3 个答案:

答案 0 :(得分:1)

64是您的批处理大小,这意味着偏差张量将添加到批处理内部的64个示例中的每个示例中。基本上,这就像您是否采用64个256的张量并将其偏置加到每个张量上。 Pytorch会自然地将256张量广播为64 * 256大小,可以将其添加到您的先前图层的64 * 256输出中。

答案 1 :(得分:1)

简单来说,每当我们使用Python库(Numpy或PyTorch)中的“广播”时,我们正在做的是处理尺寸兼容的数组(权重,偏差)。

换句话说,如果您使用W形状为[256,64]的W,并且您的偏差仅为[256]。然后,广播将弥补这一不足之处。

Broadcasting operation

如上图所示,左侧尺寸已被填充,因此我们的操作可以成功完成。希望对您有帮助

答案 2 :(得分:0)

这就是所谓的PyTorch广播。

如果使用了库,

It与NumPy广播非常相似。 这是向2D张量m添加标量的示例。

m = torch.rand(3,3)
print(m)
s=1
print(m+s)

# tensor([[0.2616, 0.4726, 0.1077],
#         [0.0097, 0.1070, 0.7539],
#         [0.9406, 0.1967, 0.1249]])
# tensor([[1.2616, 1.4726, 1.1077],
#         [1.0097, 1.1070, 1.7539],
#         [1.9406, 1.1967, 1.1249]])

这是另一个添加一维张量和二维张量的示例。

v = torch.rand(3)
print(v)
print(m+v)

# tensor([0.2346, 0.9966, 0.0266])
# tensor([[0.4962, 1.4691, 0.1343],
#         [0.2442, 1.1035, 0.7805],
#         [1.1752, 1.1932, 0.1514]])

我重写了你的例子:

def activation(x):
    return (1/(1+torch.exp(-x)))

images = torch.randn(3,28,28)
inputs = images.view(images.shape[0], -1)
print("INPUTS:", inputs.shape)

W1 = torch.randn(784, 256)
print("W1:", w1.shape)
B1 = torch.randn(256)
print("B1:", b1.shape)
h = activation(torch.mm(inputs,W1) + B1)

INPUTS: torch.Size([3, 784])
W1: torch.Size([784, 256])
B1: torch.Size([256])

说明:

INPUTS: of size [3, 784] @ W1: of size [784, 256]将创建大小为[3, 256]的张量

然后添加:

After mm: [3, 256] + B1: [256]的完成是因为B1将基于广播采用[3, 256]的形式。