尝试搭建CNN模型,使⽤给定数据集实现情绪识别。在给定根目录中有文件夹test和train,train文件夹中有angry、disgusted、fearful、happy、neutral、sad和surprised文件夹,每个文件夹中都有4000张和文件夹名相同的情绪图片。test文件夹中有7000张用于测试的图片。请根据上面内容写出这段代码。
时间: 2024-03-02 13:48:26 浏览: 135
情绪识别
好的,下面是一个简单的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=(128, 128),
batch_size=32,
class_mode='categorical'
)
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(128, 128),
batch_size=32,
class_mode='categorical'
)
# 构建CNN模型
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)),
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)
```
上面的代码首先定义了训练和测试数据的路径,然后使用ImageDataGenerator定义了图像数据生成器,用于生成训练和测试数据。接着使用flow_from_directory方法加载训练和测试数据,并设置目标大小、批量大小和类别模式。然后使用Sequential模型搭建了一个简单的CNN模型,包含了三个卷积层、三个池化层、一个全连接层和一个Dropout层。最后编译模型,设置优化器、损失函数和评估指标,并使用fit方法训练模型。在训练过程中,使用了数据增强技术来增加数据的多样性。最后在测试集上评估模型的性能,并输出测试准确率。
需要注意的是,上面的代码仅供参考,实际应用中可能需要根据实际情况进行调整和优化。
阅读全文