Как получить градиенты относительно входных данных и изменить входные (а не обучаемые переменные), чтобы минимизировать потери в TF 2? - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу использовать обученную модель для изменения входных данных, чтобы она сводила к минимуму потери (а не изменяемые обучаемые переменные) в духе Deep Dreaming в Tensorflow 2.0, но я не добилась успеха.

Скажите, что у меня естьбазовый NN, такой как в документах

class MyModel(Model):
  def __init__(self):
    super(MyModel, self).__init__()
    self.conv1 = Conv2D(32, 3, activation='relu')
    self.flatten = Flatten()
    self.d1 = Dense(128, activation='relu')
    self.d2 = Dense(10, activation='softmax')

  def call(self, x):
    x = self.conv1(x)
    x = self.flatten(x)
    x = self.d1(x)
    return self.d2(x)

model = MyModel()

, который я тренирую, используя простую функцию tf.GradientTape

@tf.function
def train_step(image, label):
  with tf.GradientTape() as tape:
    predictions = model(image)
    loss = loss_object(label, predictions)
  gradients = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

Какой идиоматический способ создать функцию, которая вместо этого будет вычислять и вычислятьпримените градиенты к входным изображениям.

Я предполагал, что это будет так же просто, как

def train_step(image, label):
  with tf.GradientTape() as tape:
    predictions = model(image)
    loss = loss_object(label, predictions)
  gradients = tape.gradient(loss, image)
  optimizer.apply_gradients(zip(gradients, image))

Однако это не сработает.

1 Ответ

2 голосов
/ 30 апреля 2019

tf.GradientTape.gradients может различать только наблюдаемый тензор. Переменные автоматически просматриваются при первом доступе. Чтобы различить произвольный тензор, вы должны явно watch it:

>>> x = tf.constant([4.0])
>>> y = tf.constant([2.0])
>>> with tf.GradientTape() as tape:
...     tape.watch([x, y])
...     z = x * y
...     
>>> tape.gradient(z, [x, y])
[<tf.Tensor: id=9, shape=(1,), dtype=float32, numpy=array([ 2.], dtype=float32)>, 
 <tf.Tensor: id=10, shape=(1,), dtype=float32, numpy=array([ 4.], dtype=float32)>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...