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