tensorflow - 了解 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 的参数“优化器”,因为我认为它是全局的,你不需要继续传递它大约。
解决方案
所以我认为你这样做是为了:
del optimizer
是您删除了用于构建图形的变量。当您这样做时,您已经构建了图形,这意味着删除变量不会做任何事情。
如果要更改优化器,可以通过以下方式重新编译:
model.compile(optimizer='Adam')
顺便说一句,我认为你把事情复杂化了。为什么不用keras提供的fit函数呢?
顺便说一句,我只是考虑了一下,我很确定模型可以在没有优化器的情况下完美运行,我稍后会尝试,或者您可以自己尝试
- 编辑:你不能,我试过
希望对您有所帮助:)
推荐阅读
- java - 迭代 nextLine 函数的问题
- java - Java根据模板从字符串中获取单词
- javascript - 为我的服务器设置数据库时要走哪条路
- twilio - Twilio 简单聚集动作
- java - java中从oracle到String的数字导致问题
- c# - 在 Simple Injector 中将生活方式与自动布线相结合是否可以?
- react-native - React Native 聊天应用,Flatlist useRef 为空
- java - 在我的 Spring 应用程序上启用 Keycloak 时没有被重定向到 Keycloak
- sql - 试图避免在 Oracle 查询中使用表别名导致“缺少右括号”错误的重复
- javascript - JavaScript 等价于 php DOMDocument 对象