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