样式迁移
样式迁移定义将样式图片上的样式迁移到内容图片上得到合成图片实线箭头和虚线箭头分别表示前向传播和反向传播风格迁移常用的损失函数由3部分组成(1)内容损失使合成图像与内容图像在内容特征上接近(2)风格损失使合成图像与风格图像在风格特征上接近(3)全变分损失则有助于减少合成图像中的噪点。数据预处理图片尺寸resize图片RGB数值归一化图片格式从 (H,W,C) → (C,H,W) → (1,C,H,W)数据后处理将CNN输出转化为“能看的”图片模型使用VGG-19选择相应的层作为内容层和风格层输出深层特征保留物体结构、空间布局去掉过多细节从浅到深覆盖不同尺度的纹理边缘→纹理→图案→全局风格裁剪VGG只保留需要的层逐层提取特征风格迁移有三张图参与内容图像固定不变风格图像固定不变合成图像每轮都在变提前算好内容目标和风格目标损失函数内容损失风格损失全变分损失内容损失利用均方误差风格损失Gram矩阵来定义什么是风格给定一个特征图CNN 某层的输出把它拉平成矩阵 X 形状为 c×hw注意这里需要最后的数值归一化避免出现较大的值影响判断这样就可以基于gram矩阵来通过均方误差得到误差全变分损失是风格迁移中的去噪器它惩罚相邻像素之间的剧烈跳变让合成图像更平滑自然。本质遍历每个像素计算它和右边、下边两个邻居的差异全部加起来。风格转移的损失函数是内容损失、风格损失和总变化损失的加权和。 通过调节这些权重超参数我们可以权衡合成图像在保留内容、迁移风格以及去噪三方面的相对重要性。初始化合成图像合成的图像是训练期间唯一需要更新的变量。因此我们可以定义一个简单的模型SynthesizedImage并将合成的图像视为模型参数。模型的前向传播只需返回模型参数即可。因为 MXNet/Gluon 的 Trainer 只能优化 nn.Block 的参数。我们套一个模型壳让框架以为我们在训练模型实际上训练的是图像像素。使用Adam优化器框架内部组件训练前的准备工作创建模型参数 图像像素init.Constant(X)用内容图像素初始化合成图。一开始合成图 内容图原样gluon.Trainer(..., adam, ...)Adam优化器学习率 lr。优化对象是合成图像素预计算风格图5个层的Gram矩阵训练时不再重复算整体的训练模型核心循环extract_features(X, ...)合成图 X 过VGG网络在目标层截获特征compute_loss(...)比较合成图和内容图/风格图的特征差异得到总损失 ltrainer.step(1)Adam优化器根据梯度更新 X 的像素值