例如,有一个三维张量,我想在它的第三维上运行conf1d计算
import torch
import torch.nn as nn
x = torch.rand(4,5,6)
conv1d =nn.Conv1d(in_channels=1,out_channels=2,kernel_size=5,stride=3,padding=0)
y = conv1d(x)
我希望y的形状是(4,5,2,-1(,但我得到了一个错误
给定组=1,大小的权重[2,1,5],预期输入[4,5,6]有1个通道,但得到了5个通道而不是
然后我修改了代码,
import torch
import torch.nn as nn
x = torch.rand(4,5,6)
conv1d =nn.Conv1d(in_channels=1,out_channels=2,kernel_size=5,stride=3,padding=0)
x = x.unsqueeze(2)
y = conv1d(x)
还有另一个错误:
预期3维权重[2,1,5]的3维输入,但得到的是尺寸为[4,5,1,6]的4维输入,而不是
如果我想在形状为(4,5,2,-1(的张量的最后二维中运行maxpoo1d计算,我该怎么办?
我在网上搜索了很长时间。但没有用。请帮助或尝试给出一些如何实现这一目标的想法。谢谢大家的帮助。
我尝试了一下,但我觉得它不能满足实际需求,我想知道这样做是否是一种好的做法,最好的方法是什么?
import torch
import torch.nn as nn
x = torch.rand(4,5,6)
conv1d =nn.Conv1d(in_channels=1,out_channels=2,kernel_size=2,stride=3,padding=0)
x = x.unsqueeze(2)
for i in range(4):
y = conv1d(x[i,:,:,:])
y = y.unsqueeze(0)
if i==0:
z = y
else:
z = torch.cat((z,y),0)
print(y)
print(z.size())
要使用Conv1d
,您需要输入3个维度:
[batch_size, in_channels, data_dimension]
因此,这将起作用:
x = torch.rand(4, 1, 50) # [batch_size=4, in_channels=1, data_dimension=50]
conv1d = nn.Conv1d(in_channels=1,out_channels=2,kernel_size=2,stride=3,padding=0)
x = conv1d(x)
print(x.shape) # Will output [4, 2, 16] 4=batch_size, 2=channels, 16=data_dimension
你可以用同样的方式使用MaxPool1d
:
maxpool1d = nn.MaxPool1d(5)
x = maxpool1d(x)
print(x.shape) # Will output [4, 2, 3] 4=batch_size, 2=channels, 3=data_dimension
我通过torch.reshape((解决了这个问题。我把代码放在这里,希望它能帮助到别人。
import torch
import torch.nn as nn
x = torch.rand(4,5,6)
conv1d =nn.Conv1d(in_channels=1,out_channels=2,kernel_size=2,stride=3,padding=0)
y = x.reshape(x.shape[0]*x.shape[1],-1)
y = y.unsqueeze(1)
y = conv1d(y)
z = y.reshape(x.shape[0],x.shape[1],2,-1)
print(z.size())