How can I solve InvalidArgumentError: Graph execution error?

How can I solve InvalidArgumentError: Graph execution error?

我正在尝试使用 CNN 和迁移学习方法来训练深度学习模型。我使用带有 ImageNet 的 VGG16 作为预训练模型。我的目标是在 Google Colab 中实现面部情绪识别,但在拟合模型时出现错误。它在第一个纪元完成后给出以下错误。

Epoch 1/50
224/224 [==============================] - ETA: 0s - loss: 1.8204 - accuracy: 0.2337
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-26-abee8cf0777d> in <module>()
     5                 epochs=epochs,
     6                 validation_data=validation_generator,
----> 7                 validation_steps=num_test_imgs//batch_size)

1 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
53     ctx.ensure_initialized()
    54     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 55                                         inputs, attrs, num_outputs)
    56   except core._NotOkStatusException as e:
    57     if name is not None:

InvalidArgumentError: Graph execution error:

Detected at node 'sequential_1/vgg16/block1_conv1/Conv2D' defined at (most recent call last):
   File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
     "__main__", mod_spec)
   File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
     exec(code, run_globals)
   File "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py", line 16, in <module>
     app.launch_new_instance()
   File "/usr/local/lib/python3.7/dist-packages/traitlets/config/application.py", line 846, in launch_instance
     app.start()
   File "/usr/local/lib/python3.7/dist-packages/ipykernel/kernelapp.py", line 499, in start
     self.io_loop.start()
   File "/usr/local/lib/python3.7/dist-packages/tornado/platform/asyncio.py", line 132, in start
     self.asyncio_loop.run_forever()
   File "/usr/lib/python3.7/asyncio/base_events.py", line 541, in run_forever
     self._run_once()
   File "/usr/lib/python3.7/asyncio/base_events.py", line 1786, in _run_once
     handle._run()
   File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
     self._context.run(self._callback, *self._args)
   File "/usr/local/lib/python3.7/dist-packages/tornado/platform/asyncio.py", line 122, in _handle_events
     handler_func(fileobj, events)
   File "/usr/local/lib/python3.7/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/zmq/eventloop/zmqstream.py", line 452, in _handle_events
     self._handle_recv()
   File "/usr/local/lib/python3.7/dist-packages/zmq/eventloop/zmqstream.py", line 481, in _handle_recv
     self._run_callback(callback, msg)
   File "/usr/local/lib/python3.7/dist-packages/zmq/eventloop/zmqstream.py", line 431, in _run_callback
     callback(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/tornado/stack_context.py", line 300, in null_wrapper
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/ipykernel/kernelbase.py", line 283, in dispatcher
     return self.dispatch_shell(stream, msg)
   File "/usr/local/lib/python3.7/dist-packages/ipykernel/kernelbase.py", line 233, in dispatch_shell
     handler(stream, idents, msg)
   File "/usr/local/lib/python3.7/dist-packages/ipykernel/kernelbase.py", line 399, in execute_request
     user_expressions, allow_stdin)
   File "/usr/local/lib/python3.7/dist-packages/ipykernel/ipkernel.py", line 208, in do_execute
     res = shell.run_cell(code, store_history=store_history, silent=silent)
   File "/usr/local/lib/python3.7/dist-packages/ipykernel/zmqshell.py", line 537, in run_cell
     return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py", line 2718, in run_cell
     interactivity=interactivity, compiler=compiler, result=result)
   File "/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py", line 2822, in run_ast_nodes
     if self.run_code(code, result):
   File "/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py", line 2882, in run_code
     exec(code_obj, self.user_global_ns, self.user_ns)
   File "<ipython-input-26-abee8cf0777d>", line 7, in <module>
     validation_steps=num_test_imgs//batch_size)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 64, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1431, in fit
     _use_cached_eval_dataset=True)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 64, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1716, in evaluate
     tmp_logs = self.test_function(iterator)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1525, in test_function
     return step_function(self, iterator)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1514, in step_function
     outputs = model.distribute_strategy.run(run_step, args=(data,))
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1507, in run_step
     outputs = model.test_step(data)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1471, in test_step
     y_pred = self(x, training=False)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 64, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py", line 1096, in __call__
     outputs = call_fn(inputs, *args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 92, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/sequential.py", line 374, in call
     return super(Sequential, self).call(inputs, training=training, mask=mask)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/functional.py", line 452, in call
     inputs, training=training, mask=mask)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/functional.py", line 589, in _run_internal_graph
     outputs = node.layer(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 64, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py", line 1096, in __call__
     outputs = call_fn(inputs, *args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 92, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/functional.py", line 452, in call
     inputs, training=training, mask=mask)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/functional.py", line 589, in _run_internal_graph
     outputs = node.layer(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 64, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py", line 1096, in __call__
     outputs = call_fn(inputs, *args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 92, in error_handler
     return fn(*args, **kwargs)
   File "/usr/local/lib/python3.7/dist-packages/keras/layers/convolutional.py", line 248, in call
     outputs = self.convolution_op(inputs, self.kernel)
   File "/usr/local/lib/python3.7/dist-packages/keras/layers/convolutional.py", line 240, in convolution_op
     name=self.__class__.__name__)
Node: 'sequential_1/vgg16/block1_conv1/Conv2D'
input depth must be evenly divisible by filter depth: 1 vs 3
    [[{{node sequential_1/vgg16/block1_conv1/Conv2D}}]] [Op:__inference_test_function_3544]

我有train和test两个文件夹,两个里面都有7个emotion文件夹,所以我把输出层设置为7个。

model.add(Dense(7, activation='softmax'))

这是完整的代码:

train_datagen = ImageDataGenerator(
    rescale=1/255,
    rotation_range=30,
    shear_range=0.3,
    zoom_range=0.3,
    horizontal_flip=True,
    fill_mode='nearest')
validation_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    color_mode='rgb',
    target_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True)
validation_generator = validation_datagen.flow_from_directory(
    validation_data_dir,
    color_mode='grayscale',
    target_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True)
class_labels=['Angry','Disgust', 'Fear', 'Happy','Neutral','Sad','Surprise']
from keras.applications.vgg16 import VGG16 
#from keras.applications import VGG16
#Load the VGG model
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.summary()
for layer in base_model.layers[:-4]:
    layer.trainable = False
 
#Check the trainable status of the individual layers
for layer in base_model.layers:
    print(layer, layer.trainable)

model = Sequential()

#Adding the vgg convolutional base model
model.add(base_model)
 
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(224,224,3),padding='same'))

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.1))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(0.1))

model.add(Conv2D(256, kernel_size=(3, 3), activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.1))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(7, activation='softmax'))

model.compile(optimizer = 'adam', loss='categorical_crossentropy', metrics=['accuracy'])
print(model.summary())
epochs=50
#train_generator=np.array(train_generator)
history=model.fit(train_generator,
                steps_per_epoch=num_train_imgs//batch_size,
                epochs=epochs,
                validation_data=validation_generator,
                validation_steps=num_test_imgs//batch_size)

我不明白错误是从哪里来的。我该如何解决这个问题?

是可以解决的。而不是使用 RGB 将图像转换为灰色。

def gray_to_rgb(img):
   x=np.dot(img[...,:3], [0.2989, 0.5870, 0.1140])
   mychannel=np.repeat(x[:, :, np.newaxis], 3, axis=2)
   return mychannel