我想在pytorch中使用Conv1D和MaxPool1D来计算三维张量到它的三维



例如,有一个三维张量,我想在它的第三维上运行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())