用三层长短时记忆神经网络对指定文件夹内的具有四个标签的图片进行分类并可视化混淆矩阵具体python
时间: 2024-05-07 20:16:19 浏览: 142
代码实现如下:
```python
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
# 设置随机种子
np.random.seed(42)
tf.random.set_seed(42)
# 设置数据路径
data_path = "/path/to/data"
# 设置图像大小和批次大小
img_size = (64, 64)
batch_size = 32
# 数据增强
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
)
test_datagen = ImageDataGenerator(rescale=1./255)
# 加载训练数据和测试数据
train_generator = train_datagen.flow_from_directory(
os.path.join(data_path, "train"),
target_size=img_size,
batch_size=batch_size,
class_mode="categorical"
)
test_generator = test_datagen.flow_from_directory(
os.path.join(data_path, "test"),
target_size=img_size,
batch_size=batch_size,
class_mode="categorical"
)
# 构建模型
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(None, img_size[0]*img_size[1]*3)),
Dropout(0.2),
LSTM(64),
Dropout(0.2),
Dense(4, activation="softmax")
])
model.summary()
# 编译模型
model.compile(loss="categorical_crossentropy",
optimizer="adam",
metrics=["accuracy"])
# 训练模型
history = model.fit(train_generator,
epochs=10,
validation_data=test_generator)
# 评估模型
test_loss, test_acc = model.evaluate(test_generator)
print("Test accuracy:", test_acc)
# 可视化混淆矩阵
test_pred = model.predict(test_generator)
test_pred_classes = np.argmax(test_pred, axis=1)
test_true_classes = test_generator.classes
class_names = list(test_generator.class_indices.keys())
cm = confusion_matrix(test_true_classes, test_pred_classes)
plt.imshow(cm, cmap=plt.cm.Blues)
plt.title("Confusion Matrix")
plt.colorbar()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names, rotation=45)
plt.yticks(tick_marks, class_names)
plt.xlabel("Predicted label")
plt.ylabel("True label")
for i in range(len(class_names)):
for j in range(len(class_names)):
plt.text(j, i, cm[i, j], ha="center", va="center")
plt.show()
```
这段代码实现了使用三层长短时记忆神经网络对指定文件夹内的具有四个标签的图片进行分类,并可视化混淆矩阵。具体实现过程如下:
1. 导入必要的库,包括 os、numpy、tensorflow、matplotlib 和 sklearn 等库。
2. 设置随机种子,防止每次运行的结果不同。
3. 设置数据路径、图像大小和批次大小。
4. 使用 ImageDataGenerator 对数据进行增强,包括旋转、平移、剪切、缩放和水平翻转等操作。
5. 使用 flow_from_directory 加载训练数据和测试数据,其中 train 和 test 文件夹分别包含训练数据和测试数据,每个文件夹中包含四个子文件夹,分别对应四个标签。
6. 构建模型,包括两层 LSTM 和一层全连接层,其中第一层 LSTM 返回序列,第二层 LSTM 不返回序列。
7. 编译模型,设置损失函数和优化器。
8. 训练模型,设置训练次数为 10 次,并使用测试数据进行验证。
9. 评估模型,计算测试数据的损失和准确率。
10. 可视化混淆矩阵,使用 sklearn 库中的 confusion_matrix 函数计算混淆矩阵,并使用 matplotlib 库中的 imshow 函数可视化混淆矩阵。可以看到混淆矩阵中的行表示真实标签,列表示预测标签,对角线上的数字表示正确分类的样本数量,其他位置上的数字表示错误分类的样本数量。
需要注意的是,这段代码只是一个示例,实际应用中还需要根据具体情况进行修改和调整。例如,可以尝试调整模型架构、增加数据增强的方式、调整训练次数和批次大小等超参数,以获得更好的分类效果。
阅读全文