keras实现用resnet18非预训练模型对四种天气分类,并绘制图像

时间: 2023-11-22 20:55:16 浏览: 27
好的,我们可以按照以下步骤实现: 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 非预训练模型对四种天气分类,并绘制了准确率随时间的变化图像。

相关推荐

最新推荐

1_消防支队能源站自控设计11.pdf

1_消防支队能源站自控设计11.pdf

单片机C语言Proteus仿真实例MAX7221控制数码管动态显示

单片机C语言Proteus仿真实例MAX7221控制数码管动态显示本资源系百度网盘分享地址

无线传感器网络相关仿真 基于RSSI测距的多边定位法仿真 生成五种网络拓扑结构 语言:Python3、MATLAB.zip

使用说明在zip压缩包 README 文件中,请仔细阅读。

lls-release_ew9q.mobileconfig

lls-release_ew9q.mobileconfig

基于JavaScript的Web项目:图书管理系统

1、资源内容:基于JavaScript的Web项目:图书管理系统 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为“参考资料”参考学习使用。 3、解压说明:本资源需要电脑端使用WinRAR、7zip等解压工具进行解压,没有解压工具的自行百度下载即可。

信息系统集成管理工程项目师必考重点内部资料.doc

信息系统集成管理工程项目师必考重点内部资料.doc

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

扎实基础工具:Maya在二维动画中的应用

# 1. Maya简介 ## 1.1 Maya软件概述 Maya是Autodesk公司推出的一款专业三维动画制作软件,被广泛应用于影视、游戏、动画等领域。它拥有强大的建模、动画、渲染等功能,是影视特效行业的主流软件之一。 ## 1.2 Maya在动画制作中的应用领域 Maya在动画制作中的应用非常广泛,可以用于制作影视特效、三维动画、角色动画、游戏动画等。其丰富的工具和功能使得动画制作更加高效和精确。 ## 1.3 Maya在二维动画制作中的优势 虽然Maya主打三维动画制作,但在二维动画制作中也有独特的优势。通过Maya的工具和功能,可以实现丰富多彩的二维动画效果,为动画制作带来

一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。 输入格式: 输入在一行中给出32位二进制字符串。 输出格式: 在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。 输入样例: 11001100100101000001010101110010 输出样例: 204.148.21.114做题

好的,这是一个简单的二进制转十进制的问题。以下是一个C++代码示例,可以实现该功能: ```cpp #include <iostream> #include <bitset> // 二进制转十进制需要使用bitset库 using namespace std; int main() { string binary; cin >> binary; // 将二进制字符串转换为bitset类型 bitset<32> bits(binary); // 依次输出四个字节的十进制数 cout << bits.to_ulong() >> 24 << "

工程项目预算与管理讲义.doc

工程项目预算与管理讲义.doc