如何解决TensorFlow深度学习项目中的InvalidArgumentError图执行错误?
TensorFlow中
InvalidArgumentError: Graph execution error问题排查与解决 我是神经网络领域的初学者,用TensorFlow做深度学习项目时碰到InvalidArgumentError: Graph execution error错误,项目马上要交付,急需解决。
代码片段:
from tensorflow.keras.layers import Input, Embedding, LSTM, Dense from tensorflow.keras.models import Model from tensorflow.keras.losses import SparseCategoricalCrossentropy from tensorflow.keras.optimizers import Adam def get_model(input_shape, vocab_size, embedding_dim, rnn_units): input = Input(shape=input_shape) embedding = Embedding(vocab_size, embedding_dim, input_length=max_sequence_len)(input) lstm = LSTM(rnn_units)(embedding) output = Dense(max_sequence_len, activation='softmax')(lstm) model = Model(input,output) model.compile(loss = SparseCategoricalCrossentropy(), optimizer = Adam(), metrics=['accuracy']) model.summary() return model from tensorflow.keras.callbacks import EarlyStopping callback = EarlyStopping(monitor='val_accuracy', mode = 'max', patience=5, restore_best_weights=True) vocab_size = len(tokenizer.word_index)+1 #total num of unique words embedding_dim = 68 rnn_units = 128 batch_size = 16 epochs = 10 model = get_model(max_sequence_len, vocab_size, embedding_dim, rnn_units) history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split = 0.1, callbacks=[callback])
错误信息:
Epoch 1/10 --------------------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) <ipython-input-31-4e8d160277a1> in <cell line: 1>() ----> 1 history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split = 0.1, callbacks=[callback]) 1 frames /usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name) 50 try: 51 ctx.ensure_initialized() ---> 52 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, 53 inputs, attrs, num_outputs) 54 except core._NotOkStatusException as e: InvalidArgumentError: Graph execution error: Detected at node 'sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits' defined at (most recent call last): File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "/usr/lib/python3.10/runpy.py", line 86, in _run_code exec(code, run_globals) File "/usr/local/lib/python3.10/dist-packages/ipykernel_launcher.py", line 16, in <module> app.launch_new_instance() File "/usr/local/lib/python3.10/dist-packages/traitlets/config/application.py", line 992, in launch_instance app.start() File "/usr/local/lib/python3.10/dist-packages/ipykernel/kernelapp.py", line 619, in start self.io_loop.start() File "/usr/local/lib/python3.10/dist-packages/tornado/platform/asyncio.py", line 195, in start self.asyncio_loop.run_forever() File "/usr/lib/python3.10/asyncio/base_events.py", line 603, in run_forever self._run_once() File "/usr/lib/python3.10/asyncio/base_events.py", line 1909, in _run_once handle._run() File "/usr/lib/python3.10/asyncio/events.py", line 80, in _run self._context.run(self._callback, *self._args) File "/usr/local/lib/python3.10/dist-packages/tornado/ioloop.py", line 685, in <lambda> lambda f: self._run_callback(functools.partial(callback, future)) File "/usr/local/lib/python3.10/dist-packages/tornado/ioloop.py", line 738, in _run_callback ret = callback() File "/usr/local/lib/python3.10/dist-packages/tornado/gen.py", line 825, in inner self.ctx_run(self.run) File "/usr/local/lib/python3.10/dist-packages/tornado/gen.py", line 786, in run yielded = self.gen.send(value) File "/usr/local/lib/python3.10/dist-packages/ipykernel/kernelbase.py", line 361, in process_one yield gen.maybe_future(dispatch(*args)) File "/usr/local/lib/python3.10/dist-packages/tornado/gen.py", line 234, in wrapper yielded = ctx_run(next, result) File "/usr/local/lib/python3.10/dist-packages/ipykernel/kernelbase.py", line 261, in dispatch_shell yield gen.maybe_future(handler(stream, idents, msg)) File "/usr/local/lib/python3.10/dist-packages/tornado/gen.py", line 234, in wrapper yielded = ctx_run(next, result) File "/usr/local/lib/python3.10/dist-packages/ipykernel/kernelbase.py", line 539, in execute_request self.do_execute( File "/usr/local/lib/python3.10/dist-packages/tornado/gen.py", line 234, in wrapper yielded = ctx_run(next, result) File "/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py", line 302, in do_execute res = shell.run_cell(code, store_history=store_history, silent=silent) File "/usr/local/lib/python3.10/dist-packages/ipykernel/zmqshell.py", line 539, in run_cell return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/IPython/core/interactiveshell.py", line 2975, in run_cell result = self._run_cell( File "/usr/local/lib/python3.10/dist-packages/IPython/core/interactiveshell.py", line 3030, in _run_cell return runner(coro) File "/usr/local/lib/python3.10/dist-packages/IPython/core/async_helpers.py", line 78, in _pseudo_sync_runner coro.send(None) File "/usr/local/lib/python3.10/dist-packages/IPython/core/interactiveshell.py", line 3257, in run_cell_async has_raised = await self.run_ast_nodes(code_ast.body, cell_name, File "/usr/local/lib/python3.10/dist-packages/IPython/core/interactiveshell.py", line 3473, in run_ast_nodes if (await self.run_code(code, result, async_=asy)): File "/usr/local/lib/python3.10/dist-packages/IPython/core/interactiveshell.py", line 3553, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-30-6ae8be589bf4>", line 25, in <cell line: 25> history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split = 0.1, callbacks=[callback]) File "/usr/local/lib/python3.10/dist-packages/keras/utils/traceback_utils.py", line 65, in error_handler return fn(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1685, in fit tmp_logs = self.train_function(iterator) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1284, in train_function return step_function(self, iterator) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1268, in step_function outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1249, in run_step outputs = model.train_step(data) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1051, in train_step loss = self.compute_loss(x, y, y_pred, sample_weight) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1109, in compute_loss return self.compiled_loss( File "/usr/local/lib/python3.10/dist-packages/keras/engine/compile_utils.py", line 265, in __call__ loss_value = loss_obj(y_t, y_p, sample_weight=sw) File "/usr/local/lib/python3.10/dist-packages/keras/losses.py", line 142, in __call__ losses = call_fn(y_true, y_pred) File "/usr/local/lib/python3.10/dist-packages/keras/losses.py", line 268, in call return ag_fn(y_true, y_pred, **self._fn_kwargs) File "/usr/local/lib/python3.10/dist-packages/keras/losses.py", line 2078, in sparse_categorical_crossentropy return backend.sparse_categorical_crossentropy( File "/usr/local/lib/python3.10/dist-packages/keras/backend.py", line 5660, in sparse_categorical_crossentropy res = tf.nn.sparse_softmax_cross_entropy_with_logits( Node: 'sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits' logits and labels must have the same first dimension, got logits shape [16,30] and labels shape [480] [[{{node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]] [Op:__inference_train_function_10246]
我已检查输入输出的正确形状以及fit函数的不同写法,尝试过一些修改,但仍未找到错误核心。
问题核心与修复方案
错误提示明确指出:logits and labels must have the same first dimension, got logits shape [16,30] and labels shape [480],这说明模型输出和标签的维度完全不匹配,核心问题出在模型结构与任务需求的错位。
问题根源
- 模型最后一层
Dense(max_sequence_len, activation='softmax')输出形状为[batch_size, max_sequence_len],但当前y_train形状是[480],两者第一维度(样本数)不对应。 - 从代码和错误来看,你大概率混淆了序列标注/生成任务和序列分类任务的模型结构:
- 如果是序列标注/生成,需要模型输出每个时间步的预测结果,对应标签形状应为
[样本数, max_sequence_len] - 如果是序列分类,模型应输出单个类别,对应标签形状应为
[样本数],且最后一层输出单元数应为类别数而非序列长度
- 如果是序列标注/生成,需要模型输出每个时间步的预测结果,对应标签形状应为
修复步骤
方案1:适配序列标注/生成任务(预测每个序列位置的结果)
修改模型让LSTM返回序列输出,同时调整输出层对应词汇表大小(预测每个位置的词索引):
def get_model(input_shape, vocab_size, embedding_dim, rnn_units): input = Input(shape=input_shape) embedding = Embedding(vocab_size, embedding_dim, input_length=max_sequence_len)(input) # 开启return_sequences=True,让LSTM返回每个时间步的输出 lstm = LSTM(rnn_units, return_sequences=True)(embedding) # 输出层单元数改为词汇表大小,预测每个位置的词索引 output = Dense(vocab_size, activation='softmax')(lstm) model = Model(input,output) model.compile(loss = SparseCategoricalCrossentropy(), optimizer = Adam(), metrics=['accuracy']) model.summary() return model
同时确保y_train的形状为[样本数, max_sequence_len],每个元素是对应位置的词索引。
方案2:适配序列分类任务(整个序列对应单个标签)
调整模型最后一层输出单元数为类别数,同时确保标签形状为[样本数]:
def get_model(input_shape, vocab_size, embedding_dim, rnn_units, num_classes): input = Input(shape=input_shape) embedding = Embedding(vocab_size, embedding_dim, input_length=max_sequence_len)(input) lstm = LSTM(rnn_units)(embedding) # 输出单元数改为任务的类别总数 output = Dense(num_classes, activation='softmax')(lstm) model = Model(input,output) model.compile(loss = SparseCategoricalCrossentropy(), optimizer = Adam(), metrics=['accuracy']) model.summary() return model # 调用时替换为你的实际类别数 model = get_model(max_sequence_len, vocab_size, embedding_dim, rnn_units, num_classes=你的类别数)
此时y_train必须是形状为[样本数]的一维数组,每个元素是类别索引。
关键检查点
- 先打印
print(x_train.shape, y_train.shape)确认数据维度,明确任务类型 - 确保模型输出维度与标签维度严格匹配:
- 序列任务:模型输出
[N, T, C],标签[N, T](N=样本数,T=序列长度,C=类别数) - 分类任务:模型输出
[N, C],标签[N]
- 序列任务:模型输出
内容的提问来源于stack exchange,提问作者Clara C
相关产品推荐
相关产品推荐

