Понимание графиков в бета-версии TF 2.0 - PullRequest
0 голосов
/ 13 июня 2019

Я делаю эксперименты с NN.Все идеально, когда я не помещаю декоратор @ tf.function в свою функцию train_one_step.Когда я говорю "отлично", я имею в виду, что все работает, как ожидалосьТем не менее, обучение идет очень медленно, поэтому я должен снова включить декоратор.Когда я это делаю, начинают происходить странные вещи, и я не понимаю этого и поэтому не могу проводить никаких экспериментов.Например, после тренировки с куполом, я решил пойти и удалить оптимизатор,

del optimizer 

Затем еще немного потренироваться, и ... все в порядке, и тренировка идет как обычно !!какого черта?Я удалил оптимизатор!когда я не ставлю декоратор и удаляю оптимизатор, программа кричит на меня и говорит, что это не определено (потому что это требуется в обучающей функции).Это всего лишь один крайний пример странных вещей, которые я не понимаю, когда декоратор включен.

Мой вопрос: кто-то может объяснить, что делает декоратор?кажется, что он берет мои вещи и строит из них график, когда он впервые вызывается, но у меня нет доступа к этому графику, похоже, что вещи происходят в другом мире, где я не могу контролировать то, что происходит.Если я изменю вещи позже в моем мире, они не будут отражаться в этом мире.

РЕДАКТИРОВАТЬ: Кто-то сказал, что это слишком общее, и я хочу код.Я сделал простую версию, основанную на mnist, чтобы проиллюстрировать

def prepare_mnist_features_and_labels(x, y):
  x = tf.cast(x, tf.float32) / 255.0
  y = tf.cast(y, tf.int64)
  return x, y

def mnist_dataset():
  (x, y), _ = tf.keras.datasets.mnist.load_data()
  ds = tf.data.Dataset.from_tensor_slices((x, y))
  ds = ds.map(prepare_mnist_features_and_labels)
  ds = ds.take(20000).shuffle(20000).batch(100)
  return ds

train_dataset = mnist_dataset()

model = tf.keras.Sequential((
    tf.keras.layers.Reshape(target_shape=(28 * 28,), input_shape=(28, 28)),
    tf.keras.layers.Dense(100, activation='relu'),
    tf.keras.layers.Dense(100, activation='relu'),
    tf.keras.layers.Dense(10)))
model.build()
optimizer = tf.keras.optimizers.Adam()

compute_loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

compute_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()


@tf.function
def train_one_step(model, x, y):
  with tf.GradientTape() as tape:
    logits = model(x)
    loss = compute_loss(y, logits)

  grads = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(grads, model.trainable_variables))

  compute_accuracy(y, logits)
  return loss


def train(model):
  train_ds = mnist_dataset()
  step = 0
  loss = 0.0
  accuracy = 0.0
  for x, y in train_ds:
    step += 1
    loss = train_one_step(model, x, y)
    if tf.equal(step % 10, 0):
      tf.print('Step', step, ': loss', loss, '; accuracy', compute_accuracy.result())
  return step, loss, accuracy

step, loss, accuracy = train(model)
print('Final step', step, ': loss', loss, '; accuracy', compute_accuracy.result())

Теперь все идеально.После запуска приведенного выше кода перейдите в другую ячейку (я предполагаю, что записная книжка Jupyter).удали оптимизатор, запусти поезд (модель), и он отлично работает !!Без оптимизатора!Если бы декоратор не был включен, этого бы не случилось.Это всего лишь один крайний пример того, как то, что я делаю, не отражается во всем, что происходит за кулисами.

Чтобы быть более ясным, это из учебника на веб-сайте TF, но я внес некоторые изменения, включая удалениепараметр 'оптимизатор', который передавался из функции train в train_one_step, потому что я думал, что он глобальный, и вам не нужно его передавать.

1 Ответ

0 голосов
/ 13 июня 2019

так что я думаю, что вы сделали, сделав это:

del optimizer

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

Если вы хотите изменить оптимизатор, вы можете перекомпилировать его:

model.compile(optimizer='Adam')

Кстати, я думаю, вы слишком усложняете вещи. почему вы не используете функцию подгонки, предоставляемую keras?

btw2, я просто подумал об этом, и я почти уверен, что модель может отлично работать без оптимизаторов, я попробую это позже, или вы можете попробовать сами

- изменить: вы не можете, я пытался

надеюсь, что это поможет кое-что:)

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