Tensorflow@tf.function-无法在Tensorflow图函数内获取会话
我试图使用@tf.function指令和Keras函数API,在简单神经网络的训练步骤中创建一个tf图。我使用的是与Python3.7一起安装的TensorFlowV2.1.0。 然而,我得到了标题中的运行时错误,我希望任何提示都能理解其原因 代码如下Tensorflow@tf.function-无法在Tensorflow图函数内获取会话,tensorflow,tensorflow2.0,tf.keras,Tensorflow,Tensorflow2.0,Tf.keras,我试图使用@tf.function指令和Keras函数API,在简单神经网络的训练步骤中创建一个tf图。我使用的是与Python3.7一起安装的TensorFlowV2.1.0。 然而,我得到了标题中的运行时错误,我希望任何提示都能理解其原因 代码如下 import tensorflow as tf import numpy as np # import the CIFAR10 dataset and normalise the feature distributions
import tensorflow as tf
import numpy as np
# import the CIFAR10 dataset and normalise the feature distributions
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
train_images = train_images / np.max(train_images)
test_images = test_images / np.max(train_images)
# convert the datasets to tf.data, batching the data
train_data = tf.data.Dataset.from_tensor_slices((train_images, train_labels)).batch(128)
test_data = tf.data.Dataset.from_tensor_slices((test_images, test_labels)).batch(128)
# make a model with a single dense layer
# note that the flatten layer is needed to convert the
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(units = 10, activation = "relu"))
# compile the model
model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate = 0.001),
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = True),
metrics = ["accuracy"])
# training step
@tf.function
def train(model, train_data, test_data):
model.fit(x = train_data,
validation_data = test_data,
epochs = 10)
return
# train the model
train(model = model, train_data = train_data, test_data = test_data)
我在运行时得到的错误如下
2020-04-01 11:33:27.084545: W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of 1228800000 exceeds 10% of system memory.
Traceback (most recent call last):
File "report.py", line 41, in <module>
train(model = model, train_data = train_data, test_data = test_data)
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 568, in __call__
result = self._call(*args, **kwds)
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 615, in _call
self._initialize(args, kwds, add_initializers_to=initializers)
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 497, in _initialize
*args, **kwds))
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2389, in _get_concrete_function_internal_garbage_collected
graph_function, _, _ = self._maybe_define_function(args, kwargs)
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2703, in _maybe_define_function
graph_function = self._create_graph_function(args, kwargs)
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2593, in _create_graph_function
capture_by_value=self._capture_by_value),
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/framework/func_graph.py", line 978, in func_graph_from_py_func
func_outputs = python_func(*func_args, **func_kwargs)
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 439, in wrapped_fn
return weak_wrapped_fn().__wrapped__(*args, **kwds)
File "/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/framework/func_graph.py", line 968, in wrapper
raise e.ag_error_metadata.to_exception(e)
RuntimeError: in converted code:
report.py:34 train *
model.fit(x = train_data,
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py:819 fit
use_multiprocessing=use_multiprocessing)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_arrays.py:648 fit
shuffle=shuffle)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py:2346 _standardize_user_data
all_inputs, y_input, dict_inputs = self._build_model_with_inputs(x, y)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py:2523 _build_model_with_inputs
inputs, targets, _ = training_utils.extract_tensors_from_dataset(inputs)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_utils.py:1677 extract_tensors_from_dataset
iterator = get_iterator(dataset)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_utils.py:1658 get_iterator
initialize_iterator(iterator)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_utils.py:1665 initialize_iterator
K.get_session((init_op,)).run(init_op)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/backend.py:493 get_session
session = _get_session(op_input_list)
/home/alessio/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/backend.py:453 _get_session
raise RuntimeError('Cannot get session inside Tensorflow graph function.')
RuntimeError: Cannot get session inside Tensorflow graph function.
1228800000的分配超过了系统内存的10%。
回溯(最近一次呼叫最后一次):
文件“report.py”,第41行,在
列车(模型=模型,列车数据=列车数据,测试数据=测试数据)
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow_core/python/eager/def_function.py”,第568行,在调用中__
结果=自身调用(*args,**kwds)
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow_core/python/eager/def_function.py”,第615行,在调用中
self.\u初始化(参数、KWD、添加初始值设定项到=初始值设定项)
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow_core/python/eager/def_function.py”,第497行,在
*args,**科威特第纳尔)
文件“/home/alesio/.local/lib/python3.7/site-packages/tensorflow\u-core/python/eager/function.py”,第2389行,位于“获取”具体“函数”内部“垃圾”收集中
图函数,自我,可能定义函数(args,kwargs)
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/eager/function.py”,第2703行,在函数定义中
graph\u function=self.\u create\u graph\u function(args,kwargs)
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/eager/function.py”,第2593行,在创建图形函数中
按值捕获=自身。_按值捕获),
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow_core/python/framework/func_graph.py”,第978行,在func_graph_中,从_py_func
func_outputs=python_func(*func_args,**func_kwargs)
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow_core/python/eager/def_function.py”,第439行,包装为
返回弱_-wrapped_-fn()
文件“/home/alesio/.local/lib/python3.7/site packages/tensorflow_core/python/framework/func_graph.py”,第968行,在包装器中
将e.ag\u错误\u元数据引发到\u异常(e)
运行时错误:在转换的代码中:
报告:py:34列车*
模型拟合(x=列车数据,
/home/alesio/.local/lib/python3.7/site packages/tensorflow_core/python/keras/engine/training.py:819-fit
使用多处理=使用多处理)
/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/keras/engine/training\u arrays.py:648 fit
洗牌
/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/keras/engine/training.py:2346\u标准化\u用户\u数据
所有输入,y输入,dict输入=自我。用输入(x,y)建立模型
/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/keras/engine/training.py:2523\u build\u model\u with\u input
输入,目标,从数据集中提取张量(输入)
/home/alesio/.local/lib/python3.7/site-packages/tensorflow\u-core/python/keras/engine/training\u-utils.py:1677从数据集中提取张量
迭代器=获取迭代器(数据集)
/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/keras/engine/training\u utils.py:1658 get\u迭代器
初始化迭代器(迭代器)
/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/keras/engine/training\u utils.py:1665 initialize\u迭代器
K.get_会话((init_op,)。运行(init_op)
/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/keras/backend.py:493 get\u会话
会话=\获取\会话(操作\输入\列表)
/home/alesio/.local/lib/python3.7/site packages/tensorflow\u core/python/keras/backend.py:453\u get\u session
raise RUNTIMERROR('无法在Tensorflow图函数内获取会话')
RuntimeError:无法在Tensorflow图函数内获取会话。
请注意,在没有@tf.function指令的情况下,与前面相同的代码可以正常运行。
另一方面,我在不同的数据集和不同的模型上得到相同的错误
提前感谢。查看文档,我不清楚您定义的函数是否可以编译成图形。我认为它应该用于Lambda层或类似层中使用的函数 您已经在模型上调用了compile,它将把模型转换成一个图,无需更多操作 我猜它是抛出的,因为它不知道如何从
model.fit
调用构建图形,但是错误消息非常混乱
如果你尝试一个简单的算术函数,比如
@tf.function
def add(x, y):
return x + y
add(1, 2)
现在输出一个张量:
<tf.Tensor: shape=(), dtype=int32, numpy=3>
TensorFlow速度很快。我不会担心性能,除非您真正了解库中发生了什么,并且知道存在问题