[](
)使用VGG提取特征
分类器CNN可以分为两部分:第一部分称为特征提取器 (feature extractor
),主要由卷积层组成;后一部分由几个全连接层组成,输出类概率得分,称为分类器头 (classifier head
)。在ImageNet上为分类任务预先训练的CNN也可以用于其他任务,这就是所谓的迁移学习 (transfer learning
),我们可以转移或重用一些学到的知识到新的网络或应用中。
在CNN中,图像重建的两个步骤如下:
-
通过CNN向前计算图像以提取特征。
-
使用随机初始化的输入,并进行训练,以便其重建与步骤1中的参考特征最匹配的特征。
在正常的网络训练中,输入图像是固定的,并且使用反向传播的梯度来更新网络权重。在神经风格迁移中,所有网络层都被冻结,而我们使用梯度来修改输入。在原始的论文使用的是 VGG19
, Keras
有一个可以使用的预训练模型。VGG的特征提取器由五个块组成,每个块的末尾都有一个下采样。每个块都有2~4个卷积层,整个VGG19具有16个卷积层和3个全连接层。
在下文中,我们将实现内容重构,同时将其扩展以执行风格迁移。以下是使用预训练的VGG提取block4_conv2的输出层的代码:
因为我们只需要提取特征,所以在实例化VGG模型时使用include_top = False冻结网络参数
vgg = tf.keras.applications.VGG19(include_top=False, weights=‘imagenet’)
content_layers = [‘block4_conv2’]
content_outputs = [vgg.get_layer(x).output for x in content_layers]
model = Model(vgg.input, content_outputs)
预训练的 Keras CNN
模型分为两部分。底部由卷积层组成,通常称为特征提取器,而顶部是由全连接层组成的分类器头。因为我们只想提取特征而不关心分类器,所以在实例化VGG模型时将设置 include_top = False
。
[](
)图像加载
首先需要加载内容图像和风格图像:
def scale_image(image):
MAX_DIM = 512
scale = np.max(image.shape)/MAX_DIM
print(image.shape)
new_shape = tf.cast(image.shape[