正文
,
content_image
):
content_layer_names
=
[
'conv3_1/conv3_1'
]
# we use the toppest layer for content loss
layers
=
model
.
get_layer_tensors
(
content_layer_names
)
content_dict
=
model
.
create_feed_dict
(
image
=
content_image
)
content_values
=
session
.
run
(
layers
,
feed_dict
=
content_dict
)
content_values
=
tf
.
constant
(
value
)
stylized_values
=
layers
#laybers will be evaluated during runtime
with
model
.
graph
.
as_default
():
layer_losses
=
[]
for
v1
,
v2
in
zip
(
content_values
,
stylized_values
):
loss
=
mean_squared_error
(
v1
,
v2
)
layer_losses
.
append
(
loss
)
total_loss
=
tf
.
reduce_mean
(
layer_losses
)
return
total_loss
计算风格偏差
比较两个图片的风格偏差会稍微复杂一点。如何用数学的式子体现两个内容完全不同的图片,风格一样呢?光光比较他们的特征是不够的,因为一个图里有桥,另一个图里可能没有。因此我们要比较两个图的特征互相之间的关系。这简直是一个天才的想法!我们用 Gram Matrix 来描述多个特征相互之间的关系,然后来比较两个图的 Gram Matrix 的距离来衡量风格的相似程度。如果 Gram Matrix 相近,即特征相互之间的关系相近,那也就说明风格相近。
与内容偏差不同,风格偏差与宏观微观的都有关系,所以我们又算出每一层的风格偏差,再求一个加权平均就好了。
Tensorflow 代码实现
def gram_matrix(tensor):
#gram matrix is just a matrix multiply it's transpose
shape = tensor.get_shape()
num_channels = int(shape[3])
matrix = tf.reshape(tensor, shape=[-1, num_channels])
gram = tf.matmul(tf.transpose(matrix), matrix)
return gram
def create_content_loss(model, content_image):