Neural network pytorch中看似不一致的张量大小

Neural network pytorch中看似不一致的张量大小,neural-network,pytorch,conv-neural-network,Neural Network,Pytorch,Conv Neural Network,我正在构建一个卷积自动编码器,但是希望编码是线性的,这样我就可以更容易地将它作为输入输入输入到MLP中。我在编码器上有两个卷积层和一个线性内层,以减少尺寸。然后将该编码馈送到相应的解码器中 当我展平第二个卷积层的输出时,根据我的计算(使用标准公式:),应该得到1x100352秩1张量。但是,当我将线性层的输入维度设置为100352时,扁平秩1张量的维度为1x50176。然后是奇怪的部分 我尝试将线性层的输入维度更改为50176,假设我计算错误。当我这样做时,重新整形的秩1张量会令人困惑地变成1x

我正在构建一个卷积自动编码器,但是希望编码是线性的,这样我就可以更容易地将它作为输入输入输入到MLP中。我在编码器上有两个卷积层和一个线性内层,以减少尺寸。然后将该编码馈送到相应的解码器中

当我展平第二个卷积层的输出时,根据我的计算(使用标准公式:),应该得到1x100352秩1张量。但是,当我将线性层的输入维度设置为100352时,扁平秩1张量的维度为1x50176。然后是奇怪的部分

我尝试将线性层的输入维度更改为50176,假设我计算错误。当我这样做时,重新整形的秩1张量会令人困惑地变成1x100352,然后前面提到的权重矩阵会像预期的那样变成50176x256

这种修改线性层输入维度的响应对我来说没有意义。这个超参数正确地控制了权重矩阵,但我想我不确定为什么它对线性层的输入有任何影响,因为这只是一个卷积层的重塑张量输出,其超参数与所讨论的超参数无关

如果我遗漏了一些明显的东西,我道歉。我是pytorch的新手,我找不到其他讨论此类问题的帖子

以下是我认为可重复性最低的示例:

导入操作系统
进口火炬
进口火炬视觉
导入torchvision.transforms作为变换
将matplotlib.pyplot作为plt导入
导入torch.autograd作为autograd
导入torch.nn作为nn
导入torch.nn.功能为F
将torch.optim导入为optim
从torchvision导入数据集
从torch.utils.data导入数据加载器
从torchvision.utils导入保存图像
类自动编码器(nn.模块):
定义初始(自我,**kwargs):
super()。\uuuu init\uuuuu()
#创建网络结构
#自动编码器的编码器部分
self.enc1=nn.Conv2d(in_通道=kwargs[“InputChannel”]、out_通道=kwargs[“channelsEncoderMid”]、内核大小=kwargs[“kernelSize”])
self.enc2=nn.Conv2d(in_Channel=kwargs[“channelsEncoderMid”]、out_Channel=kwargs[“channelsEncoderInner”]、kernel_size=kwargs[“kernelSize”])
self.enc3=nn.Linear(in_features=kwargs[“intoLinear”]、out_features=kwargs[“LinearCoded”])
#自动编码器的解码器部分
self.dec1=nn.Linear(in_features=kwargs[“LinearCoded”]、out_features=kwargs[“intoLinear”])
self.dec2=nn.ConvTranspose2d(in_通道=kwargs[“channelsEncoderInner”]、out_通道=kwargs[“ChannelsCoderMid”]、内核大小=kwargs[“kernelSize”])
self.dec3=nn.ConvTranspose2d(in_通道=kwargs[“ChannelsCoderMid”]、out_通道=kwargs[“InputChannel”]、内核大小=kwargs[“kernelSize”])
def前进(自身,x):
#编码
x=F.relu(自身附件1(x))
x=F.relu(自身附件2(x))
x=x。重塑(1,-1)
x=x.挤压()
x=F.relu(自身附件3(x))
#解码
x=F.relu(自dec1(x))
x=x.重塑([32,4,28,28])
x=F.relu(自十二月二日(x))
x=F.relu(自dec3(x))
返回x
def ENCODECOCONV(numEpochs=20,输入通道=3,批处理大小=32,
通道编码器内部=4,通道编码器中间=8,进入线性=100352,
线性编码=256,信道解码器=8,内核大小=3,
学习率=1e-3):
#选择一个设备。如果GPU可用,请使用它。否则,请使用CPU。
device=torch.device(“cuda”如果torch.cuda.is_可用()否则为“cpu”)
#定义数据转换
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)))
#定义训练数据集
trainSet=datasets.CIFAR10(根='./数据',train=True,download=True,transform=transform)
#定义测试数据集
testSet=datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)
#定义数据加载器
列车装载机=数据装载机(列车组,批量大小=批量大小,随机播放=真)
testLoader=DataLoader(testSet,batch_size=batchSize,shuffle=True)
#初始化神经网络
模型=convAutoEncoder(输入通道=输入通道,通道SENCoderMid=通道编码器,通道SENCoderInner=通道编码器内部,intoLinear=进入线性,linearEncoded=线性编码,通道SENCoderMid=通道解码器,内核大小=内核大小)
#优化设置
标准=nn.MSELoss()
optimizer=optim.Adam(model.parameters(),lr=learningRate)
lossTracker=[]
对于范围内的历元(numEpochs):
损失=0
对于数据,在火车装载机中:
数据=数据到(设备)
optimizer.zero_grad()
输出=模型(数据)
列车损耗=标准(输出、数据)
列车损失向后()
optimizer.step()
损失+=列车损失。项目()
损失=损失/长度(火车装载机)
打印({}的{}纪元,列车损失:{:.3f}'。格式(纪元+1,数字,损失))
encodeconv()

Edit2:在CIFAR10数据集中的某个地方,数据似乎改变了维度。在更多地使用打印语句之后,我发现将相关的超参数设置为100352对于许多条目都非常有效,但是似乎会弹出一个大小不同的图像。但不确定为什么会出现这种情况。

请提供一个最小的、可重复的示例。已添加。我真是太傻了,连一个都没有。