如何解决VGG训练中mean_squared_error节点的InvalidArgumentError图执行错误?
在Google Colab中运行VGG结构的Keras训练代码时,触发InvalidArgumentError图执行错误,错误检测节点为'mean_squared_error/SquaredDifference',不确定该错误由数据集、代码还是依赖问题导致,以下是完整模型代码及报错信息:
模型代码
# 定义模型 from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, BatchNormalization from keras.layers import Activation, Flatten, Dense from keras.optimizers import Adam from keras.losses import mean_absolute_error model = Sequential() # 添加卷积层 model.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=(height, width, 3))) model.add(Conv2D(32, (3, 3), padding='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), padding='same', activation='relu')) model.add(Conv2D(64, (3, 3), padding='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(128, (3, 3), padding='same', activation='relu')) model.add(Conv2D(128, (3, 3), padding='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) # 添加全连接层 model.add(Flatten()) model.add(Dense(256, activation='relu')) model.add(Dense(128, activation='relu')) model.add(Dense(3)) # 编译模型 #opt = Adam(learning_rate=0.001, decay=0.001/(30*0.5)) # 训练模型 model.compile(optimizer='adam', loss='mse', metrics=["accuracy"]) callbacks = [ keras.callbacks.EarlyStopping(patience=5, monitor="val_loss", mode="min", restore_best_weights=True)] model.fit(x_train, y_train, epochs=30, batch_size=32, validation_data=(x_val, y_val), callbacks=callbacks)
报错信息
InvalidArgumentError Traceback (most recent call last) <ipython-input-3-6eba740a4ec6> in <cell line: 132>() 130 keras.callbacks.EarlyStopping(patience=5, monitor="val_loss", mode="min", restore_best_weights=True)] 131 ---> 132 model.fit(x_train, y_train, epochs=30, batch_size=32, validation_data=(x_val, y_val), callbacks=callbacks) 133 134 # Implementar el modelo en una aplicación o programa 1 frames /usr/local/lib/python3.9/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 'mean_squared_error/SquaredDifference'
解决方案
检查标签维度与模型输出匹配:模型最后一层是
Dense(3),输出形状为(batch_size, 3),因此y_train和y_val必须是对应形状的张量。如果标签是一维数组,需用y_train = y_train.reshape(-1, 3)调整维度,确保与模型输出维度一致。移除不兼容的评估指标:当前使用
mse(均方误差,回归任务损失),但metrics设置了"accuracy"——这是分类任务的指标,回归任务中计算精度会导致逻辑冲突,进而触发计算错误。建议替换为回归任务适配的指标,比如metrics=['mae'](平均绝对误差)。检查数据类型一致性:确保训练数据
x_train、y_train和验证数据x_val、y_val的类型均为float32(Keras默认浮点类型),若存在整数或其他类型,用x_train = x_train.astype('float32')统一转换。清理数据中的异常值:数据集中的NaN、无穷大值会导致平方差计算失败,可通过以下代码检查并清理:
import numpy as np # 检查并清理训练集 x_train = x_train[~np.isnan(x_train).any(axis=(1,2,3))] y_train = y_train[~np.isnan(y_train).any(axis=1)] x_train = x_train[~np.isinf(x_train).any(axis=(1,2,3))] y_train = y_train[~np.isinf(y_train).any(axis=1)] # 验证集同理确认输入尺寸变量已定义:模型输入依赖
height和width变量,需确保这两个变量已被正确赋值,且与x_train、x_val的图像尺寸完全匹配(比如x_train.shape[1:]应为(height, width, 3))。
内容的提问来源于stack exchange,提问作者Victor Comendador Checa

