在此之前
我们一定要搞明白模型背后的数学原理
我们的Loss损失函数是什么
计算每个featuremap之间的欧及里的距离可以知道2个图片的相近度
计算featuremap之间的协方差 可以计算2个图片的风格相似度
优化就是优化 生成的图片和内容图片每个层里面的featuremap之间的欧及里的距离
生成图片和要转换的风格图片 每层里面featuremap之间的协方差之间的距离
代码实现
import numpy as np
import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.optim as optim
import PIL
from PIL import Image
import matplotlib.pyplot as plt
import torchvision.transforms as transforms
import torchvision.models as models
# cuda
use_cuda = torch.cuda.is_available()
dtype = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor
# images
"""
图片的加载和预处理
"""
imsize = 200 # desired size of the output image
loader = transforms.Compose([
transforms.Scale(imsize), # scale imported image
transforms.ToTensor()]) # transform it into a torch tensor
def image_loader(image_name):
image = Image.open(image_name)
image = Variable(loader(image))
# fake batch dimension required to fit network's input dimensions
image = image.unsqueeze(0)
return image
style = image_loader("./images/picasso.jpg").type(dtype)
content = image_loader("./images/dancing.jpg").type(dtype)
assert style.size() == content.size(),"we need to import style and content images of the same size"
# display
unloader = transforms.ToPILImage() # reconvert into PIL image
def toimage(tensor):
image = tensor.clone().cpu() # we clone the tensor to not do changes on it
image = image.view(3, imsize, imsize) # remove the fake batch dimension
image = unloader(image)
return image
# content loss
"""
图片2个mapfeature之间的欧及里得距离可以判断2个图片的内容相似度
每个mapfeature之间的协方差矩阵则表示2个图片之间风格相似度
这就是这个loss的理论基础
生成一个图片使得 与内容图片内容相近 风格相近 分别算2个不不同loss即可
"""
class ContentLoss(nn.Module):
def __init__(self, target, weight):
super(ContentLoss, self).__init__()
# we 'detach' the target content from the tree used
#
self.target = target