我是机器学习领域的新手。我正在尝试实现文章“使用智能手表和深度学习进行游泳风格识别和圈数计数”( https://doi.org/10.1145/3341163.3347719 )中的模型。模型的输入由 11 个通道的窗口数据组成,大小为 180。但是在第一个卷积层和最大池化之后,它们的张量由 11 层组成,窗口大小等于 59,但还有另一个维度,有 64 个特征图。但作者仅使用了内核大小为 3x1 的 conv1d。
我无法使用 nn.Conv1d 实现这样的内核。我怎样才能做到这一点?
我是机器学习领域的新手。我正在尝试实现文章“使用智能手表和深度学习进行游泳风格识别和圈数计数”( https://doi.org/10.1145/3341163.3347719 )中的模型。模型的输入由 11 个通道的窗口数据组成,大小为 180。但是在第一个卷积层和最大池化之后,它们的张量由 11 层组成,窗口大小等于 59,但还有另一个维度,有 64 个特征图。但作者仅使用了内核大小为 3x1 的 conv1d。
我无法使用 nn.Conv1d 实现这样的内核。我怎样才能做到这一点?
我有以下程序:
import torch
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self, input_size, output_size):
super(Net, self).__init__()
self.net = nn.Sequential()
self.fc1 = nn.Linear(input_size, 32)
self.fc2 = nn.Linear(32, 32)
self.fc3 = nn.Linear(32, output_size)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net(input_size=10, output_size=1)
x = torch.from_numpy(np.random.rand(2,10)).type(torch.FloatTensor)
y = net(x)
x0 = x[0,]
y0 = net(x0)
print(y[0,],y0)
assert y0.item() == y[0,].item(), "Outputs not equal"
在程序中,即使一次在批处理中和一次在没有批处理中给出相同的输入,为什么神经网络会返回两个不同的输出?虽然差别很小,但我很好奇为什么会出现这种情况?
我期望输出完全相同,因为所有计算都是确定性的!
我有一个a
由神经模型生成的向量,需要与一个巨大的矩阵交互M
。由于M
很大,我必须在 cpu 设备中进行计算。在这种情况下,我想知道梯度是否可以在cuda设备上保留并向后移动。
示例如下:
a_cuda = torch.randn([1, 512], requires_grad=True).to("cuda")
a_cpu = torch.randn([1, 512], requires_grad=True).to("cpu")
M = torch.randn([512, 100000], requires_grad=False) # loaded in cpu device, dont need update
out_cuda = (a_cuda.cpu() @ M).sum()
out_cuda.backward()
out_cpu = (a_cpu @ M).sum()
out_cpu.backward()
print(a_cuda.grad) # None
print(a_cpu.grad)
我正在寻找具有a_cuda.grad
相同梯度的解决方案a_cpu.grad
。