Pytorch Py2D自动编码器输出形状

Pytorch Py2D自动编码器输出形状,pytorch,artificial-intelligence,conv-neural-network,autoencoder,Pytorch,Artificial Intelligence,Conv Neural Network,Autoencoder,我构建了bellow卷积自动编码器,并尝试对其进行调整,以在不增加损失的情况下获得[NxHxW]=1024的编码器输出形状(x_编码器)。目前我的输出形状是[4,64,64],有什么想法吗 # define the NN architecture class ConvAutoencoder(nn.Module): def __init__(self): super(ConvAutoencoder, self).__init__() ## encoder l

我构建了bellow卷积自动编码器,并尝试对其进行调整,以在不增加损失的情况下获得[NxHxW]=1024的编码器输出形状(x_编码器)。目前我的输出形状是[4,64,64],有什么想法吗

# define the NN architecture
class ConvAutoencoder(nn.Module):
    def __init__(self):
        super(ConvAutoencoder, self).__init__()
        ## encoder layers ##
        # conv layer (depth from in --> 16), 3x3 kernels
        self.conv1 = nn.Conv2d(1, 16, 3, padding=1)  
        # conv layer (depth from 16 --> 4), 3x3 kernels
        self.conv2 = nn.Conv2d(16, 4, 3, padding=1)
        # pooling layer to reduce x-y dims by two; kernel and stride of 2
        self.pool = nn.MaxPool2d(2, 2)
        
        ## decoder layers ##
        ## a kernel of 2 and a stride of 2 will increase the spatial dims by 2
        self.t_conv1 = nn.ConvTranspose2d(4, 16, 2, stride=2)
        self.t_conv2 = nn.ConvTranspose2d(16, 1, 2, stride=2)

    def forward(self, x):
        ## encode ##
        # add hidden layers with relu activation function
        # and maxpooling after
        x = F.relu(self.conv1(x))
        x = self.pool(x)
        # add second hidden layer
        x = F.relu(self.conv2(x))
        x = self.pool(x)  # compressed representation
        x_encoder = x
        ## decode ##
        # add transpose conv layers, with relu activation function
        x = F.relu(self.t_conv1(x))
        # output layer (with sigmoid for scaling from 0 to 1)
        x = F.sigmoid(self.t_conv2(x))
                
        return x, x_encoder
 

如果您想保留参数的数量,添加
nn.AdaptiveAvgPool2d((N,H,W))
nn.AdaptiveMaxPool2d((N,H,W))
层来代替池层(
self.pool
)后的层可以强制解码器的输出具有形状
[NxHxW]

如果要保留参数的数量,添加
nn.AdaptiveAvgPool2d((N,H,W))
nn.AdaptiveMaxPool2d((N,H,W))
层,代替池层(
self.pool
)可以强制解码器的输出具有形状
[NxHxW]

假设x_编码器的形状为
(火炬大小([1,4,64,64])
。可以添加一个跨距设置为2的Conv.层或一个Conv.层,后跟一个池层。请检查以下代码:

#conv层(深度自-->16),3x3内核
self.conv1=nn.Conv2d(1,16,3,padding=1)
#conv层(深度从16-->4开始),3x3内核
self.conv2=nn.Conv2d(16,4,3,padding=1)
#池层将x-y dims减少2;内核和步幅减少2
self.pool=nn.MaxPool2d(2,2)
#变化
self.conv3=nn.Conv2d(4,1,1,2)
#或
self.conv3=nn.Conv2d(4,1,1)
self.maxpool2d=nn.maxpool2d((2,2))

假设x_编码器的形状为
(火炬大小([1,4,64,64]),则此操作应有效。
。您可以添加一个跨距设置为2的Conv.层或一个Conv.层,后跟一个池层。请检查以下代码:

#conv层(深度自-->16),3x3内核
self.conv1=nn.Conv2d(1,16,3,padding=1)
#conv层(深度从16-->4开始),3x3内核
self.conv2=nn.Conv2d(16,4,3,padding=1)
#池层将x-y dims减少2;内核和步幅减少2
self.pool=nn.MaxPool2d(2,2)
#变化
self.conv3=nn.Conv2d(4,1,1,2)
#或
self.conv3=nn.Conv2d(4,1,1)
self.maxpool2d=nn.maxpool2d((2,2))

只有两个卷积层就很难得到1024*1024的形状。@planet_pluto抱歉不是1024x1024,例如[1,32,32]或[16,8,8],可以看作是1024。只有两个卷积层就很难得到1024*1024的形状。@planet_pluto抱歉不是1024x1024,例如[1,32,32]或[16,8,8]可以看作1024。是的,但是解码器输出将相应地改变,与原始图像形状不同,并且无法训练模型。是的,但是解码器输出将相应地改变,与原始图像形状不同,并且无法训练模型。我试过了,损失急剧增加!您的数据否rmalized以及您尝试使用的损失函数是什么?不,我的损失是nn.BCELoss(),我尝试过,损失急剧增加!您的数据是否正常化以及您尝试使用的损失函数是什么?不,我的损失是nn.BCELoss()