编辑:我尝试打开急切执行以查看是否可以准确确定问题发生的位置,急切执行停止了错误并使其成功运行。不知道为什么会这样,不幸的是这对我没有帮助。
原始帖子:我对 Tensorflow 很陌生,我正在尝试了解如何在 tf.keras 模型中使用 Tensorflow-Hub 模块。我的目标是创建一个电子邮件分类系统来在我的组织中路由电子邮件。
我已经使用使用通用句子编码器模块预处理的数据构建了一个模型。这是一个 RNN 并且工作得非常有效,但我对是否可以提高我的准确性很感兴趣。
现在我想将这个模块直接整合到我的神经网络中,这样我就可以训练它了。
我在 Jupyter Notebook 中运行它。
我构建了一个简单的非 RNN 模型来尝试对 Tensorflow-Hub 模块进行培训。
print("Version: ", tf.__version__)
print("Eager mode: ", tf.executing_eagerly())
print("Hub version: ", hub.__version__)
print("GPU is", "available" if tf.test.is_gpu_available() else "NOT AVAILABLE")
hub_module = "https://tfhub.dev/google/tf2-preview/nnlm-en-dim128/1"
model = models.Sequential()
model.add(hub.KerasLayer(hub_module, input_shape=[], dtype=tf.string, trainable=True))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(3, activation='softmax'))
model.build()
model.summary()
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy', 'mae'])
#Fake data
train_data = [["Hello how are you"], ["Goodbye my friend"], ["Happiness is a warm slice of toast"]]
train_labels = [[1, 0, 0],[0, 1, 0],[0, 0, 1]]
train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels))
model.fit(train_dataset, epochs=1, verbose=2)
这是我的完整控制台输出:
Version: 1.14.0
Eager mode: False
Hub version: 0.6.0
GPU is available
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
keras_layer_5 (KerasLayer) (None, 128) 124642688
_________________________________________________________________
dense_15 (Dense) (None, 128) 16512
_________________________________________________________________
dense_16 (Dense) (None, 64) 8256
_________________________________________________________________
dense_17 (Dense) (None, 3) 195
=================================================================
Total params: 124,667,651
Trainable params: 124,667,651
Non-trainable params: 0
_________________________________________________________________
WARNING:tensorflow:Expected a shuffled dataset but input dataset `x` is not shuffled. Please invoke `shuffle()` on input dataset.
WARNING:tensorflow:Expected a shuffled dataset but input dataset `x` is not shuffled. Please invoke `shuffle()` on input dataset.
---------------------------------------------------------------------------
InvalidArgumentError Traceback (most recent call last)
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py in _do_call(self, fn, *args)
1355 try:
-> 1356 return fn(*args)
1357 except errors.OpError as e:
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py in _run_fn(feed_dict, fetch_list, target_list, options, run_metadata)
1338 # Ensure any changes to the graph are reflected in the runtime.
-> 1339 self._extend_graph()
1340 return self._call_tf_sessionrun(
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py in _extend_graph(self)
1373 with self._graph._session_run_lock(): # pylint: disable=protected-access
-> 1374 tf_session.ExtendSession(self._session)
1375
InvalidArgumentError: Node 'Adam/gradients/keras_layer_1/StatefulPartitionedCall_grad/StatefulPartitionedCall': Connecting to invalid output 1 of source node keras_layer_1/StatefulPartitionedCall which has 1 outputs
During handling of the above exception, another exception occurred:
InvalidArgumentError Traceback (most recent call last)
<ipython-input-11-492e87ad5d5d> in <module>
28 train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels))
29
---> 30 model.fit(train_dataset, epochs=1, verbose=2)
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
778 validation_steps=validation_steps,
779 validation_freq=validation_freq,
--> 780 steps_name='steps_per_epoch')
781
782 def evaluate(self,
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py in model_iteration(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq, mode, validation_in_fit, prepared_feed_values_from_dataset, steps_name, **kwargs)
139 reset_dataset_after_each_epoch = True
140 steps_per_epoch = training_utils.infer_steps_for_dataset(
--> 141 inputs, steps_per_epoch, epochs=epochs, steps_name=steps_name)
142 input_iterator = _get_iterator(inputs, model._distribution_strategy)
143
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\engine\training_utils.py in infer_steps_for_dataset(dataset, steps, epochs, steps_name)
1391 """
1392 assert isinstance(dataset, dataset_ops.DatasetV2)
-> 1393 size = K.get_value(cardinality.cardinality(dataset))
1394 if size == cardinality.INFINITE and steps is None:
1395 raise ValueError('When passing an infinitely repeating dataset, you '
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\backend.py in get_value(x)
2987 return function([], x)(x)
2988
-> 2989 return x.eval(session=get_session((x,)))
2990
2991
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\backend.py in get_session(op_input_list)
460 if not _MANUAL_VAR_INIT:
461 with session.graph.as_default():
--> 462 _initialize_variables(session)
463 return session
464
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\backend.py in _initialize_variables(session)
877 # marked as initialized.
878 is_initialized = session.run(
--> 879 [variables_module.is_variable_initialized(v) for v in candidate_vars])
880 uninitialized_vars = []
881 for flag, v in zip(is_initialized, candidate_vars):
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py in run(self, fetches, feed_dict, options, run_metadata)
948 try:
949 result = self._run(None, fetches, feed_dict, options_ptr,
--> 950 run_metadata_ptr)
951 if run_metadata:
952 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
1171 if final_fetches or final_targets or (handle and feed_dict_tensor):
1172 results = self._do_run(handle, final_targets, final_fetches,
-> 1173 feed_dict_tensor, options, run_metadata)
1174 else:
1175 results = []
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
1348 if handle is None:
1349 return self._do_call(_run_fn, feeds, fetches, targets, options,
-> 1350 run_metadata)
1351 else:
1352 return self._do_call(_prun_fn, handle, feeds, fetches)
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py in _do_call(self, fn, *args)
1368 pass
1369 message = error_interpolation.interpolate(message, self._graph)
-> 1370 raise type(e)(node_def, op, message)
1371
1372 def _extend_graph(self):
InvalidArgumentError: Node 'Adam/gradients/keras_layer_1/StatefulPartitionedCall_grad/StatefulPartitionedCall': Connecting to invalid output 1 of source node keras_layer_1/StatefulPartitionedCall which has 1 outputs