'Input incompatible error' 在 VGG16 模型中使用灰度图像
'Input incompatible error' while using gray scale images in VGG16 model
我正在做一项任务来检测一堆灰度图像的面部情绪。我正在尝试为此使用 VGG16 模型。我将灰度图像的输入数组转换为 RGB。但是当我将 RGB 图像数组传递给我的模型时,出现不兼容错误
input_array(灰度)形状为48X48X1
'Converting gray scale to RGB'
'''
input_RGB = np.ndarray(shape=input_array.shape[0],input_array.shape[1],input_array.shape[2], 3),dtype=np.uint8)
input_RGB[:, :, :, 0] = input_array[:, :, :, 0]
input_RGB[:, :, :, 1] = input_array[:, :, :, 0]
input_RGB[:, :, :, 2] = input_array[:, :, :, 0]
'''
'Model definition'
'''
from tensorflow.keras.applications.vgg16 import VGG16
base_model = VGG16(weights='imagenet', include_top=False, input_shape = (48, 48, 3))
model2 = Sequential([base_model])
model2.add(Flatten())
model2.add(Dropout(0.25))
model2.add(Dense(64, activation='relu'))
model2.add(Dropout(0.25))
model2.add(Dense(7, activation='softmax'))
model2.compile(optimizer = 'adam', loss='categorical_crossentropy', metrics=['accuracy'])
'''
'Model fitting'
'''
history = model.fit(input_RGB, output_array, batch_size = 64, epochs= 20,
validation_split=0.25,callbacks=[VGG_saved])
'''
'Error message'
'''
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:571 train_function *
outputs = self.distribute_strategy.run(
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:951 run **
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
return fn(*args, **kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:531 train_step **
y_pred = self(x, training=True)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py:886 __call__
self.name)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/input_spec.py:216 assert_input_compatibility
' but received input with shape ' + str(shape))
ValueError: Input 0 of layer sequential_5 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [None, 48, 48, 3]'
我观察到的另一件事是,当我在 model.fit 中随机尝试将灰度图像数组作为输入时,它并没有抛出错误,但是验证准确性非常低。
请帮忙
尝试从 Sequential
转移到
inputs = keras.Input(shape=(48, 48, 3))
x = base_model(inputs)
x = keras.layers.GlobalAveragePooling2D()(x)
x = keras.layers.Dropout(0.25)(x)
x = keras.layers.Dense(64)(x)
x = keras.layers.Dropout(0.25)(x)
outputs = keras.layers.Dense(7)(x)
model = keras.Model(inputs, outputs)
跟踪问题所在可能更容易。
此外,您应该只使用 GlobalAveragePooling
而不是 Flatten
+ AVGPooling
,因为它可以使用可变大小的输入。
我正在做一项任务来检测一堆灰度图像的面部情绪。我正在尝试为此使用 VGG16 模型。我将灰度图像的输入数组转换为 RGB。但是当我将 RGB 图像数组传递给我的模型时,出现不兼容错误
input_array(灰度)形状为48X48X1
'Converting gray scale to RGB'
'''
input_RGB = np.ndarray(shape=input_array.shape[0],input_array.shape[1],input_array.shape[2], 3),dtype=np.uint8)
input_RGB[:, :, :, 0] = input_array[:, :, :, 0]
input_RGB[:, :, :, 1] = input_array[:, :, :, 0]
input_RGB[:, :, :, 2] = input_array[:, :, :, 0]
''' 'Model definition' '''
from tensorflow.keras.applications.vgg16 import VGG16
base_model = VGG16(weights='imagenet', include_top=False, input_shape = (48, 48, 3))
model2 = Sequential([base_model])
model2.add(Flatten())
model2.add(Dropout(0.25))
model2.add(Dense(64, activation='relu'))
model2.add(Dropout(0.25))
model2.add(Dense(7, activation='softmax'))
model2.compile(optimizer = 'adam', loss='categorical_crossentropy', metrics=['accuracy'])
''' 'Model fitting' '''
history = model.fit(input_RGB, output_array, batch_size = 64, epochs= 20,
validation_split=0.25,callbacks=[VGG_saved])
'''
'Error message' '''
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:571 train_function *
outputs = self.distribute_strategy.run(
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:951 run **
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
return fn(*args, **kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:531 train_step **
y_pred = self(x, training=True)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py:886 __call__
self.name)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/input_spec.py:216 assert_input_compatibility
' but received input with shape ' + str(shape))
ValueError: Input 0 of layer sequential_5 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [None, 48, 48, 3]'
我观察到的另一件事是,当我在 model.fit 中随机尝试将灰度图像数组作为输入时,它并没有抛出错误,但是验证准确性非常低。
请帮忙
尝试从 Sequential
转移到
inputs = keras.Input(shape=(48, 48, 3))
x = base_model(inputs)
x = keras.layers.GlobalAveragePooling2D()(x)
x = keras.layers.Dropout(0.25)(x)
x = keras.layers.Dense(64)(x)
x = keras.layers.Dropout(0.25)(x)
outputs = keras.layers.Dense(7)(x)
model = keras.Model(inputs, outputs)
跟踪问题所在可能更容易。
此外,您应该只使用 GlobalAveragePooling
而不是 Flatten
+ AVGPooling
,因为它可以使用可变大小的输入。