Tensorflow tape.gradient (), возвращающий None при передаче стиля - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю над переводом стилей глубокого обучения с использованием 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...