Я работаю над переводом стилей глубокого обучения с использованием vgg19, но не могу заставить мой оптимизатор работать, поскольку мой градиент не будет вычисляться, а tape.gradient не вернет ничего. Я не могу найти никаких проблем в моем коде. Вот код для ленты потерь и градиента.
"изображение" - тензор TensorFlow
Потеря
image_features = get_features(image, model)
style_features = get_features(style, model)
content_loss = tf.reduce_mean(tf.square(image_features[3]-content_features[3]))
content_loss *= content_weight
style_loss = 0
style_weights = [1.0, 0.8, 0.5, 0.3, 0.1]
for w in range(len(style_weights)):
gram_image = gram_matrix(image_features[w])
gram_style = gram_matrix(style_features[w])
style_loss += style_weights[w] * tf.reduce_mean(tf.square(gram_image - gram_style))
print("content_loss: ", content_loss, "style_loss: ", style_loss)
loss = content_loss + style_loss
grad = get_gradient(loss, image)
gram_matrix
def gram_matrix(tensor):
channels = tensor.shape[-1]
a = tf.reshape(tensor, [-1, channels])
n = a.shape[0]
gram = tf.matmul(a, a, transpose_a = True)
return gram
get_features - как рассчитываются образ и style_features
def get_features(image, model):
output = model(image)
features = [layer[0] for layer in output]
return features
градиент
def get_gradient(loss, image):
with tf.GradientTape() as tape:
tape.watch(loss)
grad = tape.gradient(loss, image)
return grad