You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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],这说明模型输出和标签的维度完全不匹配,核心问题出在模型结构与任务需求的错位。

问题根源

  1. 模型最后一层Dense(max_sequence_len, activation='softmax')输出形状为[batch_size, max_sequence_len],但当前y_train形状是[480],两者第一维度(样本数)不对应。
  2. 从代码和错误来看,你大概率混淆了序列标注/生成任务和序列分类任务的模型结构:
    • 如果是序列标注/生成,需要模型输出每个时间步的预测结果,对应标签形状应为[样本数, 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:29:55