Я пытаюсь реализовать переводную бумагу универсального стиля здесь .
Я все еще застрял на первом этапе, который заключается в обучении сетей декодера для различных уровней сети VGG. Когда моя потеря остановилась, я проверяю свою сеть декодеров, чтобы посмотреть, как она работает, но, похоже, она выводит только вид полутонового варианта входного изображения, а не полноцветное изображение.
Я попытался удалить слои ReLU в конце как декодера, так и кодера.
Я поиграл с функцией потерь без удачи.
Также я попытался использовать транспонированные слои конвоя, а не обычные слои конвона, но оба показывают один и тот же результат.
Это мой декодер, использующий транспонированные сверточные слои.
class decoder1_transp(torch.nn.Module):
def __init__(self):
super(decoder1_transp,self).__init__()
self.conv5_1 = ConvTranspose2d(64,64, kernel_size=(3,3),stride=(1,1),padding=1)
self.relu5_1 = ReLU(inplace=True)
self.conv5_2 = ConvTranspose2d(64,3, kernel_size=(3,3),stride=(1,1),padding=1)
def forward(self, x):
x = self.conv5_1(x)
x = self.relu5_1(x)
x = self.conv5_2(x)
return x
Как получить соответствующий кодер:
enc = vgg19().features[:3]
А вот и тренировка декодера:
epochs = 100
for epoch in range(epochs):
running_loss = 0.0
num_batches = 0
for i, data in enumerate(data_loader,0):
lr_sched.step()
inp,_ = data
inp = inp.cuda()
enc_out = enc(inp)
out = dec(enc_out)
reconstruct_out = enc(out)
loss_first = crit(out,inp)
loss_second = crit(reconstruct_out, enc_out)
loss = loss_first + loss_second
opt.zero_grad()
loss.backward()
opt.step()
num_batches+=1
running_loss += loss.item()
print('Epoch:\t', str(epoch), '\tAverage Loss:\t', str(running_loss/num_batches))
Пример ввода и вывода:
https://imgur.com/a/15D8eZv