使用 tf.eager 训练复杂的 nn 模型(更好地使用 TF2 符号支持)
Train complicated nn models with tf.eager (better with TF2 symbolic support)
是否有(或多或少)简单的方法来编写复杂的 NN 模型,使其可以在 eager 模式下进行训练?是否有此类代码的示例?
例如,我想使用InceptionResnetV2
。我有使用 tf.contrib.slim
创建的代码。根据这个 link, https://github.com/tensorflow/tensorflow/issues/16182 ,slim 已被弃用,我需要使用 Keras
。而且我真的不能使用精简的代码来进行急切的训练,因为我无法获取变量列表并应用梯度(好吧,我可以尝试将模型包装到 GradientTape
中,但不确定如何处理正则化损失)。
好的,我们试试Keras
。
In [30]: tf.__version__
Out[30]: '1.13.1'
In [31]: tf.enable_eager_execution()
In [32]: from keras.applications.inception_resnet_v2 import InceptionResNetV2
In [33]: model = InceptionResNetV2(weights=None)
...
/usr/local/lib/python3.6/dist-packages/keras_applications/inception_resnet_v2.py in InceptionResNetV2(include_top, weights, input_tensor, input_shape, pooling, classes, **kwargs)
246
247 if input_tensor is None:
--> 248 img_input = layers.Input(shape=input_shape)
249 else:
250 if not backend.is_keras_tensor(input_tensor):
...
RuntimeError: tf.placeholder() is not compatible with eager execution.
默认情况下不起作用。
在本教程中,他们说我需要制作自己的 class 模型并自己维护变量 https://www.tensorflow.org/tutorials/eager/custom_training#define_the_model。我不确定我是否想为 Inception 做这件事。要创建和维护的变量太多。这就像回到旧版本的 TF
,在连 slim 都不存在的日子里。
在本教程中,网络是使用 Keras
https://www.tensorflow.org/tutorials/eager/custom_training_walkthrough#create_a_model_using_keras but I doubt that I can easily maintain complicated structure in a such way, by only defining model without using it with Input
. For example, in this article, if I understand correctly, author initialize keras Input
and propagate it through the model (which causes RuntimeError
when used with Eager, as you seen earlier). I can make my own model by subclassing the model class as here: https://www.tensorflow.org/api_docs/python/tf/keras/Model 创建的。哎呀,这样我需要维护层,而不是变量。对我来说这似乎是几乎相同的问题。
这里 https://www.tensorflow.org/beta/guide/autograph#keras_and_autograph 有趣地提到了 AutoGrad
。他们只覆盖__call__
,所以在这种情况下我似乎不需要维护变量,但我还没有测试它。
那么,有什么简单的解决办法吗?
在 GradientTape
中包裹苗条模型?我怎样才能将 reg loss 应用于权重?
自己跟踪每个变量?听起来有点痛。
使用Keras
?模型中有分支和复杂结构时如何使用eager?
您的第一种方法可能是最常见的。此错误:
RuntimeError: tf.placeholder() is not compatible with eager execution.
是因为不能在急切模式下使用 tf.placeholder
。急于执行时没有这种东西的概念。
您可以使用 tf.data
API 为您的训练数据构建数据集并将其提供给模型。像这样用你的真实数据替换数据集:
import tensorflow as tf
tf.enable_eager_execution()
model = tf.keras.applications.inception_resnet_v2.InceptionResNetV2(weights=None)
model.compile(tf.keras.optimizers.Adam(), loss=tf.keras.losses.categorical_crossentropy)
### Replace with tf.data.Datasets for your actual training data!
train_x = tf.data.Dataset.from_tensor_slices(tf.random.normal((10,299,299,3)))
train_y = tf.data.Dataset.from_tensor_slices(tf.random.uniform((10,), maxval=10, dtype=tf.int32))
training_data = tf.data.Dataset.zip((train_x, train_y)).batch(BATCH_SIZE)
model.fit(training_data)
正如您标题中提到的,这种方法在 TensorFlow 2.0 中同样有效。
是否有(或多或少)简单的方法来编写复杂的 NN 模型,使其可以在 eager 模式下进行训练?是否有此类代码的示例?
例如,我想使用InceptionResnetV2
。我有使用 tf.contrib.slim
创建的代码。根据这个 link, https://github.com/tensorflow/tensorflow/issues/16182 ,slim 已被弃用,我需要使用 Keras
。而且我真的不能使用精简的代码来进行急切的训练,因为我无法获取变量列表并应用梯度(好吧,我可以尝试将模型包装到 GradientTape
中,但不确定如何处理正则化损失)。
好的,我们试试Keras
。
In [30]: tf.__version__
Out[30]: '1.13.1'
In [31]: tf.enable_eager_execution()
In [32]: from keras.applications.inception_resnet_v2 import InceptionResNetV2
In [33]: model = InceptionResNetV2(weights=None)
...
/usr/local/lib/python3.6/dist-packages/keras_applications/inception_resnet_v2.py in InceptionResNetV2(include_top, weights, input_tensor, input_shape, pooling, classes, **kwargs)
246
247 if input_tensor is None:
--> 248 img_input = layers.Input(shape=input_shape)
249 else:
250 if not backend.is_keras_tensor(input_tensor):
...
RuntimeError: tf.placeholder() is not compatible with eager execution.
默认情况下不起作用。
在本教程中,他们说我需要制作自己的 class 模型并自己维护变量 https://www.tensorflow.org/tutorials/eager/custom_training#define_the_model。我不确定我是否想为 Inception 做这件事。要创建和维护的变量太多。这就像回到旧版本的 TF
,在连 slim 都不存在的日子里。
在本教程中,网络是使用 Keras
https://www.tensorflow.org/tutorials/eager/custom_training_walkthrough#create_a_model_using_keras but I doubt that I can easily maintain complicated structure in a such way, by only defining model without using it with Input
. For example, in this article, if I understand correctly, author initialize keras Input
and propagate it through the model (which causes RuntimeError
when used with Eager, as you seen earlier). I can make my own model by subclassing the model class as here: https://www.tensorflow.org/api_docs/python/tf/keras/Model 创建的。哎呀,这样我需要维护层,而不是变量。对我来说这似乎是几乎相同的问题。
这里 https://www.tensorflow.org/beta/guide/autograph#keras_and_autograph 有趣地提到了 AutoGrad
。他们只覆盖__call__
,所以在这种情况下我似乎不需要维护变量,但我还没有测试它。
那么,有什么简单的解决办法吗?
在 GradientTape
中包裹苗条模型?我怎样才能将 reg loss 应用于权重?
自己跟踪每个变量?听起来有点痛。
使用Keras
?模型中有分支和复杂结构时如何使用eager?
您的第一种方法可能是最常见的。此错误:
RuntimeError: tf.placeholder() is not compatible with eager execution.
是因为不能在急切模式下使用 tf.placeholder
。急于执行时没有这种东西的概念。
您可以使用 tf.data
API 为您的训练数据构建数据集并将其提供给模型。像这样用你的真实数据替换数据集:
import tensorflow as tf
tf.enable_eager_execution()
model = tf.keras.applications.inception_resnet_v2.InceptionResNetV2(weights=None)
model.compile(tf.keras.optimizers.Adam(), loss=tf.keras.losses.categorical_crossentropy)
### Replace with tf.data.Datasets for your actual training data!
train_x = tf.data.Dataset.from_tensor_slices(tf.random.normal((10,299,299,3)))
train_y = tf.data.Dataset.from_tensor_slices(tf.random.uniform((10,), maxval=10, dtype=tf.int32))
training_data = tf.data.Dataset.zip((train_x, train_y)).batch(BATCH_SIZE)
model.fit(training_data)
正如您标题中提到的,这种方法在 TensorFlow 2.0 中同样有效。