Numpy 与Pytorch 关于一维数组的处理(1)

引入

在人工智能的训练中,常常会遇到,element-wise的乘法(对应项相乘)和点积(点乘)运算。很多学习人工智的小伙伴多是从Numpy入手,然后转到Pytorch的。
但是有一些,小的问题处理上,还是有一些差距,会造成很多的误解。比如,对于一维向量的乘法和点积就有如下的差别:

Numpy中的一维数组的乘法与点乘

element-wise的乘法的结果,仍然是,向量。而 点积(点乘)的运算则是一个具体的值。

import numpy as np
a = np.array([1, 2, 3])
b = np.array([1, 2, 3])
print(np.dot(a, b),   np.multiply(a, b))

运算结果:

14   [1 4 9]

Pytorch中的一维数组的乘法与点乘

import torch
a = torch.tensor([1, 2, 3])
b = torch.tensor([1, 2, 3])
print(torch.mul(a, b))
print(torch.mm(a, b))

运算结果:

tensor([1, 4, 9])
Traceback (most recent call last):
    print(torch.mm(a, b))
RuntimeError: self must be a matrix

element-wise的乘法是没有问题的,但是,点积的求法,则会报错。该如何改呢?

import torch
a = torch.tensor([1, 2, 3]).unsqueeze(dim=0)
b = torch.tensor([1, 2, 3]).unsqueeze(dim=1)
print(a.shape,  b.shape)
print(torch.mm(a, b))

运算结果:

torch.Size([1, 3]) torch.Size([3, 1])
tensor([[14]])

如果,在此时,作一下,element-wise的乘法,会如何呢?
结论是会发生,广播机制。

import torch
a = torch.tensor([1, 2, 3]).unsqueeze(dim=0)
b = torch.tensor([1, 2, 3]).unsqueeze(dim=1)
print(a.shape, b.shape)
print(torch.mul(a, b))

结果:

torch.Size([1, 3]) torch.Size([3, 1])
tensor([[1, 2, 3],
        [2, 4, 6],
        [3, 6, 9]])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个使用PyTorch实现的一维CNN模型,将一维数组作为输入,输出一个一维数组。 ```python import torch import torch.nn as nn # 定义CNN模型 class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv1d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1) self.pool1 = nn.MaxPool1d(kernel_size=2) self.conv2 = nn.Conv1d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1) self.pool2 = nn.MaxPool1d(kernel_size=2) self.fc1 = nn.Linear(64 * 2, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.conv1(x) x = nn.functional.relu(x) x = self.pool1(x) x = self.conv2(x) x = nn.functional.relu(x) x = self.pool2(x) x = x.view(-1, 64 * 2) x = self.fc1(x) x = nn.functional.relu(x) x = self.fc2(x) return x # 定义输入和输出 input_data = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=torch.float32).unsqueeze(0).unsqueeze(0) output_data = torch.tensor([1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=torch.float32).unsqueeze(0) # 定义模型、损失函数和优化器 model = CNN() criterion = nn.BCEWithLogitsLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练模型 for epoch in range(100): optimizer.zero_grad() output = model(input_data) loss = criterion(output, output_data) loss.backward() optimizer.step() print(f'Epoch {epoch+1} - Loss: {loss.item():.4f}') # 测试模型 test_input = torch.tensor([1, 3, 5, 7, 9, 11, 13, 15, 17, 19], dtype=torch.float32).unsqueeze(0).unsqueeze(0) with torch.no_grad(): test_output = model(test_input) print(test_output.squeeze().numpy()) ``` 上面的代码中使用了PyTorch实现了一个包含一维卷积层、池化层和全连接层的CNN模型,用于从一维数组中提取特征。我们可以使用这个模型来对任何包含10个元素的一维数组进行分类或回归任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

developer_wgl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值