基于keras实现自定义图像数据集分类并绘制混淆矩阵、散点图可视化、经过网络每一层的特征代码实现
时间: 2023-08-11 17:06:04 浏览: 120
首先,我们需要准备一个自定义图像数据集,并将其分成训练集和测试集。这里我们假设数据集已经准备好并存储在本地目录下的`data`文件夹中。
接下来,我们使用Keras来构建一个卷积神经网络模型,并使用训练集来训练它。下面是一个简单的模型示例:
```python
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
# 定义模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 加载数据集
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'data/train',
target_size=(64, 64),
batch_size=32,
class_mode='binary')
test_generator = test_datagen.flow_from_directory(
'data/test',
target_size=(64, 64),
batch_size=32,
class_mode='binary')
# 训练模型
model.fit_generator(
train_generator,
steps_per_epoch=2000,
epochs=10,
validation_data=test_generator,
validation_steps=800)
```
在这个示例中,我们使用了一个卷积神经网络,包含三个卷积层和两个全连接层。我们还使用ImageDataGenerator来进行数据增强,并将训练集和测试集加载到内存中。
接下来,我们可以使用测试集来评估模型的性能,并绘制混淆矩阵和散点图。下面是一个简单的示例:
```python
import numpy as np
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
# 预测测试集
y_pred = model.predict_generator(test_generator, steps=800//32+1)
y_pred = np.where(y_pred > 0.5, 1, 0)
# 计算混淆矩阵
cm = confusion_matrix(test_generator.classes, y_pred)
# 绘制混淆矩阵
plt.imshow(cm, cmap=plt.cm.Blues)
plt.title('Confusion matrix')
plt.colorbar()
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.xticks([0, 1], ['Cat', 'Dog'])
plt.yticks([0, 1], ['Cat', 'Dog'])
plt.show()
# 绘制散点图
from sklearn.manifold import TSNE
# 提取网络中间层特征
layer_name = 'dense_1'
intermediate_layer_model = Model(inputs=model.input,
outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict_generator(test_generator, steps=800//32+1)
# 降维到二维空间
tsne = TSNE(n_components=2)
tsne_output = tsne.fit_transform(intermediate_output)
# 绘制散点图
plt.scatter(tsne_output[:, 0], tsne_output[:, 1], c=test_generator.classes, cmap=plt.cm.Set1)
plt.title('Scatter plot of intermediate layer features')
plt.show()
```
在这个示例中,我们首先使用predict_generator函数来预测测试集的标签,并计算混淆矩阵。然后,我们使用sklearn库中的TSNE函数来提取网络中间层的特征,并将它们降维到二维空间。最后,我们使用matplotlib库来绘制散点图。
阅读全文