Q на ленте "гиперсетей". Градиент из книги Ф. Чолле для исследователей: ускоренный курс - PullRequest
0 голосов
/ 12 марта 2019

Вот URL-адрес оригинальной записной книжки Colab:

https://colab.research.google.com/drive/17u-pRZJnKN0gO5XZmq8n5A2bKGrfKEUg#scrollTo=xEuWqzjlPobA

Прокрутите до последней ячейки в разделе «Теперь для быстрого примера исследования: гиперсети.»:

input_dim = 784
classes = 10

# The model we'll actually use (the hypernetwork).
outer_model = Linear(classes)

# It doesn't need to create its own weights, so let's mark it as already built.
# That way, calling `outer_model` won't create new variables.
outer_model.built = True

# The model that generates the weights of the model above.
inner_model = Linear(input_dim * classes + classes)

# Loss and optimizer.
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)

# Prepare a dataset.
(x_train, y_train), _ = tf.keras.datasets.mnist.load_data()
dataset = tf.data.Dataset.from_tensor_slices(
    (x_train.reshape(60000, 784).astype('float32') / 255, y_train))

# We'll use a batch size of 1 for this experiment.
dataset = dataset.shuffle(buffer_size=1024).batch(1)

losses = []  # Keep track of the losses over time.
for step, (x, y) in enumerate(dataset):
  with tf.GradientTape() as tape:

    # Predict weights for the outer model.
    weights_pred = inner_model(x)

    # Reshape them to the expected shapes for w and b for the outer model.
    w_pred = tf.reshape(weights_pred[:, :-classes], (input_dim, classes))
    b_pred = tf.reshape(weights_pred[:, -classes:], (classes,))

    # Set the weight predictions as the weight variables on the outer model.
    outer_model.w = w_pred
    outer_model.b = b_pred

    # Inference on the outer model.
    preds = outer_model(x)
    loss = loss_fn(y, preds)

  # Train only inner model.
  grads = tape.gradient(loss, inner_model.trainable_weights)
  optimizer.apply_gradients(zip(grads, inner_model.trainable_weights))

  # Logging.
  losses.append(float(loss))
  if step % 100 == 0:
    print(step, sum(losses) / len(losses))

  # Stop after 1000 steps.
  if step >= 1000:
    break

В цикле обучения обратите внимание, что:

grads = tape.gradient(loss, inner_model.trainable_weights)

находится снаружи:

with tf.GradientTape() as tape:

Я думал, что это должно быть внутри?Было бы здорово, если бы кто-то мог убедиться, что это правильно, а также объяснить, что происходит с градиентной лентой одновременно.

Если вы запустите эту записную книжку, какой бы код, по-видимому, работал, поскольку вы можете видеть, что потери приходились на каждую эпоху.

1 Ответ

0 голосов
/ 14 марта 2019

Все примеры, которые я видел, имеют это вне утверждения with. Обратите внимание, что лента перестает существовать вне оператора with. Функция " exit " просто вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...