用卷积网络搭建五种分类的EfficientNet的B4的代码,加上准确率和损失率可视化,注明分类函数并给出每一步的解释
时间: 2024-05-12 07:20:12 浏览: 146
以下是使用卷积网络搭建EfficientNet-B4进行五种分类的代码,同时包含准确率和损失率的可视化:
```python
import tensorflow as tf
from tensorflow.keras.applications import EfficientNetB4
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
# 指定数据集路径
train_dir = 'path/to/train'
val_dir = 'path/to/val'
test_dir = 'path/to/test'
# 设置图像大小和批次大小
image_size = (224, 224)
batch_size = 32
# 使用ImageDataGenerator生成训练、验证和测试数据
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)
train_generator = train_datagen.flow_from_directory(train_dir, target_size=image_size, batch_size=batch_size, class_mode='categorical')
val_datagen = ImageDataGenerator(rescale=1./255)
val_generator = val_datagen.flow_from_directory(val_dir, target_size=image_size, batch_size=batch_size, class_mode='categorical')
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(test_dir, target_size=image_size, batch_size=batch_size, class_mode='categorical')
# 加载预训练的EfficientNet-B4模型
base_model = EfficientNetB4(weights='imagenet', include_top=False, input_shape=(image_size[0], image_size[1], 3))
# 冻结EfficientNet-B4模型的所有层
for layer in base_model.layers:
layer.trainable = False
# 添加全局平均池化层和全连接层
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(5, activation='softmax')(x)
# 构建分类模型
model = Model(inputs=base_model.input, outputs=predictions)
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
history = model.fit(train_generator, epochs=10, validation_data=val_generator)
# 评估模型
test_loss, test_acc = model.evaluate(test_generator)
print('Test accuracy:', test_acc)
# 绘制训练和验证损失率和准确率的曲线
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(len(acc))
plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
```
在这个代码中,我们首先指定了数据集路径、图像大小和批次大小。然后使用`ImageDataGenerator`生成训练、验证和测试数据。这里使用数据增强技术对训练数据进行增强,包括旋转、平移、剪切、缩放和水平翻转等。对于验证和测试数据,只进行归一化处理。
接下来,我们加载预训练的EfficientNet-B4模型,并冻结所有层。然后添加全局平均池化层和全连接层,最后输出5个类别的softmax概率值。这里使用`Model`函数构建模型。
在模型构建完成后,我们使用`compile`函数编译模型,并使用`fit`函数训练模型。训练完成后,我们使用`evaluate`函数评估模型在测试数据上的准确率和损失率,同时将训练和验证的准确率和损失率可视化。
最后,我们可以使用这个训练好的模型对新的图像进行分类,使用`predict`函数输出每个类别的概率值。
阅读全文