首页 > 解决方案 > 了解 TF 2.0 beta 中的图表

问题描述

我正在用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 notebook)。删除优化器,运行 train(model),它运行良好!!没有优化器!!如果没有装饰器,就不会发生这种情况。这只是我所做的事情没有反映在幕后发生的事情中的一个极端例子。

更清楚地说,这是来自 TF 网站教程,但我做了一些更改,包括删除从 train 函数传递到 train_one_step 的参数“优化器”,因为我认为它是全局的,你不需要继续传递它大约。

标签: tensorflowkeras

解决方案


所以我认为你这样做是为了:

del optimizer

是您删除了用于构建图形的变量。当您这样做时,您已经构建了图形,这意味着删除变量不会做任何事情。

如果要更改优化器,可以通过以下方式重新编译:

model.compile(optimizer='Adam')

顺便说一句,我认为你把事情复杂化了。为什么不用keras提供的fit函数呢?

顺便说一句,我只是考虑了一下,我很确定模型可以在没有优化器的情况下完美运行,我稍后会尝试,或者您可以自己尝试

- 编辑:你不能,我试过

希望对您有所帮助:)


推荐阅读