keras实现用resnet18非预训练模型对四种天气分类,并绘制图像
时间: 2023-11-22 13:55:16 浏览: 112
好的,我们可以按照以下步骤实现:
1. 导入所需的库
2. 准备数据集
3. 构建模型
4. 训练模型
5. 绘制图像并进行预测
下面是实现的代码和详细解释。
1. 导入所需的库
```python
import os
import numpy as np
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras.optimizers import Adam
```
2. 准备数据集
我们假设有一个包含训练图片的文件夹 `train` 和一个包含测试图片的文件夹 `test`,它们都包含四个子文件夹 `cloudy`、`rain`、`shine` 和 `sunrise`,分别用于存放不同天气条件下的图片。
```python
# 设置数据集路径
train_data_dir = 'train'
test_data_dir = 'test'
# 设置图片尺寸和批次大小
img_rows, img_cols = 224, 224
batch_size = 16
# 使用ImageDataGenerator从文件夹中读取数据
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_data_dir,
target_size=(img_rows, img_cols),
batch_size=batch_size,
class_mode='categorical')
test_generator = test_datagen.flow_from_directory(test_data_dir,
target_size=(img_rows, img_cols),
batch_size=batch_size,
class_mode='categorical')
```
3. 构建模型
我们使用 ResNet18 模型作为基础模型,将其修改为适合我们的任务。我们需要将最后一层的分类器替换为适合我们的分类器,并且将其锁定以便于我们仅训练新的层。
```python
# 构建模型
model = Sequential()
# 第一层
model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', input_shape=(img_rows, img_cols, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第二层
model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第三层
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第四层
model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第五层
model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第六层
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第七层
model.add(Conv2D(filters=256, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第八层
model.add(Conv2D(filters=256, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第九层
model.add(Conv2D(filters=256, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第十层
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第十一层
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第十二层
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第十三层
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第十四层
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第十五层
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第十六层
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第十七层
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
# 第十八层
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第十九层
model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
# 第二十层
model.add(Dense(4))
model.add(Activation('softmax'))
# 加载预训练权重
# model.load_weights('resnet18_weights_tf_dim_ordering_tf_kernels_notop.h5')
# 锁定预训练权重
# for layer in model.layers:
# layer.trainable = False
```
4. 训练模型
我们使用 Adam 优化器和交叉熵损失函数进行训练,训练 10 个 epochs。
```python
# 编译模型
model.compile(loss='categorical_crossentropy',
optimizer=Adam(lr=0.0001),
metrics=['accuracy'])
# 训练模型
history = model.fit_generator(train_generator,
epochs=10,
verbose=1,
validation_data=test_generator)
```
5. 绘制图像并进行预测
我们可以绘制训练和验证准确率随时间的变化,并使用训练好的模型进行预测。
```python
# 绘制训练和验证准确率随时间的变化
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'r', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend(loc=0)
plt.figure()
plt.show()
# 预测测试集数据
test_generator.reset()
pred = model.predict_generator(test_generator, verbose=1)
predicted_class_indices = np.argmax(pred, axis=1)
# 获取类别标签
labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
# 输出预测结果
print(predictions)
```
这样,我们就成功地用 ResNet18 非预训练模型对四种天气分类,并绘制了准确率随时间的变化图像。
阅读全文
相关推荐


















