尝试搭建CNN模型,使⽤给定数据集实现情绪识别。在给定根目录中有文件夹test和train,train文件夹中有angry、disgusted、fearful、happy、neutral、sad和surprised文件夹,每个文件夹中都有4000张和文件夹名相同的情绪图片,图片的分辨率为48*48。test文件夹中有7000张用于测试的图片。请根据上面内容写出这段代码。
时间: 2024-03-02 21:48:28 浏览: 246
好的,下面是一个使用给定数据集实现情绪识别的CNN模型搭建和训练的代码示例:
```python
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 设置训练和测试数据的路径
train_dir = 'train/'
test_dir = 'test/'
# 定义图像数据生成器
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
)
test_datagen = ImageDataGenerator(rescale=1./255)
# 加载训练和测试数据
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(48, 48),
batch_size=32,
color_mode='grayscale',
class_mode='categorical'
)
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(48, 48),
batch_size=32,
color_mode='grayscale',
class_mode='categorical'
)
# 构建CNN模型
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(7, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(train_generator,
epochs=50,
validation_data=test_generator)
# 在测试集上评估模型性能
test_loss, test_acc = model.evaluate(test_generator)
print('Test accuracy:', test_acc)
```
这段代码和前面的示例非常相似,只需稍作修改即可适应新的数据集。根据题目要求,我们将图像的分辨率设置为48x48,并使用了“grayscale”颜色模式。其他部分的代码与前面的示例基本相同,包括数据生成器、CNN模型、编译模型、训练模型和测试模型等。需要注意的是,在训练过程中,我们仍然使用了数据增强技术来增加数据的多样性。最后在测试集上评估模型的性能,并输出测试准确率。
需要注意的是,上面的代码仅供参考,实际应用中可能需要根据实际情况进行调整和优化。
阅读全文