keras实现用简易的Googlenet模型分类四种天气图像,并绘制图像
时间: 2024-02-13 13:00:31 浏览: 160
好的,我来为您介绍一下使用Keras实现用GoogLeNet模型分类四种天气图像的步骤,以及如何绘制图像。
1. 准备数据集
首先,我们需要准备一个包含四种天气图像的数据集。可以手动从网络上下载图片,并按照分类放置在不同的文件夹中,也可以使用Python的第三方库进行下载和处理。这里我们以手动下载的方式为例,将数据集放置在`./data/`文件夹下,其中包含`./data/sunny/`、`./data/rainy/`、`./data/cloudy/`、`./data/snowy/`四个文件夹,分别存放不同天气条件下的图片。
2. 数据预处理
为了让模型更好地学习和泛化,我们需要对数据进行预处理。这里我们使用Keras提供的ImageDataGenerator类进行数据增强和归一化处理。
```python
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
rescale=1./255, # 图像像素值缩放到0-1之间
rotation_range=20, # 随机旋转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(
'./data/train',
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
validation_generator = test_datagen.flow_from_directory(
'./data/validation',
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
```
3. 构建模型
接下来,我们使用Keras构建一个简易的GoogLeNet模型。GoogLeNet是一种非常经典的深度卷积神经网络模型,它具有非常好的分类效果和较小的模型大小。
```python
from keras.layers import Input, Conv2D, MaxPooling2D, Concatenate, Dropout, Flatten, Dense
from keras.models import Model
input_tensor = Input(shape=(224, 224, 3))
# 第一个Inception模块
conv1_1 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_tensor)
conv1_3 = Conv2D(64, (3, 3), padding='same', activation='relu')(conv1_1)
conv1_5 = Conv2D(64, (5, 5), padding='same', activation='relu')(conv1_1)
pool1_3 = MaxPooling2D((3, 3), strides=(1, 1), padding='same')(conv1_1)
concat1 = Concatenate(axis=-1)([conv1_3, conv1_5, pool1_3])
# 第二个Inception模块
conv2_1 = Conv2D(128, (1, 1), padding='same', activation='relu')(concat1)
conv2_3 = Conv2D(128, (3, 3), padding='same', activation='relu')(conv2_1)
conv2_5 = Conv2D(128, (5, 5), padding='same', activation='relu')(conv2_1)
pool2_3 = MaxPooling2D((3, 3), strides=(1, 1), padding='same')(conv2_1)
concat2 = Concatenate(axis=-1)([conv2_3, conv2_5, pool2_3])
# 第三个Inception模块
conv3_1 = Conv2D(256, (1, 1), padding='same', activation='relu')(concat2)
conv3_3 = Conv2D(256, (3, 3), padding='same', activation='relu')(conv3_1)
conv3_5 = Conv2D(256, (5, 5), padding='same', activation='relu')(conv3_1)
pool3_3 = MaxPooling2D((3, 3), strides=(1, 1), padding='same')(conv3_1)
concat3 = Concatenate(axis=-1)([conv3_3, conv3_5, pool3_3])
# 全局平均池化和全连接层
avg_pool = GlobalAveragePooling2D()(concat3)
output_tensor = Dense(4, activation='softmax')(avg_pool)
model = Model(inputs=input_tensor, outputs=output_tensor)
model.summary()
```
4. 训练模型
模型构建完成后,我们使用Keras提供的fit方法进行训练。这里我们使用交叉熵作为损失函数,Adam优化器作为优化算法,并设置了每个epoch结束后进行一次模型保存。
```python
from keras.callbacks import ModelCheckpoint
model.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
checkpoint = ModelCheckpoint('./model.h5', monitor='val_loss', save_best_only=True, verbose=1)
model.fit_generator(
train_generator,
steps_per_epoch=train_generator.n // train_generator.batch_size,
epochs=50,
validation_data=validation_generator,
validation_steps=validation_generator.n // validation_generator.batch_size,
callbacks=[checkpoint]
)
```
5. 评估模型
最后,我们使用训练好的模型对测试集进行评估,并计算模型的准确率。
```python
test_generator = test_datagen.flow_from_directory(
'./data/test',
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
loss, acc = model.evaluate_generator(
test_generator,
steps=test_generator.n // test_generator.batch_size,
verbose=1
)
print('Test loss:', loss)
print('Test accuracy:', acc)
```
6. 绘制图像
我们可以使用matplotlib库绘制模型的训练和验证准确率曲线。
```python
import matplotlib.pyplot as plt
history = model.history.history
plt.plot(history['accuracy'])
plt.plot(history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()
```
使用以上步骤,我们就可以用Keras实现用GoogLeNet模型分类四种天气图像,并绘制图像了。
阅读全文
相关推荐


















