import os
import matplotlib.pyplot as plt
import numpy as np
import torch
from torch import nn
import torch.optim as optim
import torchvision
#pip install torchvision 需要提前安装好这个模块
from torchvision import transforms, models, datasets
#https://pytorch.org/docs/stable/torchvision/index.html
import imageio
import time
import warnings
import random
import sys
import copy
import json
from PIL import Image
#神经网络数据集
from flower_dataset import dataloaders
filename='checkpoint.pth'
"""""""""""""""冻结神经网络权重函数open"""""""""""""""
def set_parameter_requires_grad(model, feature_extracting):
if feature_extracting: #这里为true
for param in model.parameters():
param.requires_grad = False #把除了最后全连接层,前面所有层权重冻结不能修改
"""""""""""""""冻结神经网络权重函数end"""""""""""""""
"""""""""""""""修改全连接层函数(官方)open"""""""""""""""
#(模型名字、得到类别个数、模型权重、
def initialize_model(model_name, num_classes, feature_extract, use_pretrained=True):
# 选择合适的模型,不同模型的初始化方法稍微有点区别
model_ft = None
input_size = 0
if model_name == "resnet":
""" Resnet152
"""
#加载模型(下载)
model_ft = models.resnet152(pretrained=use_pretrained)
#有选择性的选需要冻住哪些层
set_parameter_requires_grad(model_ft, feature_extract)
#取出最后一层
num_ftrs = model_ft.fc.in_features
#重新做全连接层(102这里需要修改,因为本任务分类类别是102)
model_ft.fc = nn.Sequential(nn.Linear(num_ftrs, 102),
nn.LogSoftmax(dim=1))
input_size = 224
elif model_name == "alexnet":
""" Alexnet
"""
model_ft = models.alexnet(pretrained=use_pretrained)
set_parameter_requires_grad(model_ft, feature_extract)
num_ftrs = model_ft.classifier[6].in_features
model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
input_size = 224
elif model_name == "vgg":
""" VGG11_bn
"""
model_ft = models.vgg16(pretrained=use_pretrained)
set_parameter_requires_grad(model_ft, feature_extract)
num_ftrs = model_ft.classifier[6].in_features
model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
input_size = 224
elif model_name == "squeezenet":
""" Squeezenet
"""
model_ft = models.squeezenet1_0(pretrained=use_pretrained)
set_parameter_requires_grad(model_ft, feature_extract)
model_ft.classifier[1] = nn.Conv2d(512, num_classes, kernel_size=(1,1), stride=(1,1))
model_ft.num_classes = num_classes
input_size = 224
elif model_name == "densenet":
""" Densenet
"""
model_ft = models.densenet121(pretrained=use_pretrained)
set_parameter_requires_grad(model_ft, feature_extract)
num_ftrs = model_ft.classifier.in_features
model_ft.classifier = nn.Linear(num_ftrs, num_classes)
input_size = 224
elif model_name == "inception":
""" Inception v3
Be careful, expects (299,299) sized images and has auxiliary output
"""
model_ft = models.inception_v3(pretrained=use_pretrained)
set_parameter_requires_grad(model_ft, feature_extract)
# Handle the auxilary net
num_ftrs = model_ft.AuxLogits.fc.in_features
model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)
# Handle the primary net
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_ftrs,num_classes)
input_size = 299
else:
print("Invalid model name, exiting...")
exit()
return model_ft, input_size
"""""""""""""""修改全连接层函数(官方)end"""""""""""""""
"""""""""""""""训练模型函数open"""""""""""""""
#得到并保存神经网络模型checkpoint.pth
#(模型,数据,损失函数,优化器
def train_model(model, dataloaders, criterion, optimizer, num_epochs=25, is_inception=False, filename=filename):
since = time.time()
#保存最好的准确率
best_acc = 0
"""
checkpoint = torch.load(filename)
best_acc = checkpoint['best_acc']
model.load_state_dict(checkpoint['state_dict'])
optimizer.load_state_dict(checkpoint['optimizer'])
model.class_to_idx = checkpoint['mapping']
"""
#指定CPU做训练
model.to(device)
val_acc_history = []
train_acc_history = []
train_losses = []
valid_losses = []
LRs = [optimizer.param_groups[0]['lr']]
#最好的一次存下来
best_model_wts = copy.deepcopy(model.state_dict())
for epoch in range(num_epochs):
print('Epoch {}/{}'.format(epoch, num_epochs - 1))
print('-' * 10)
# 训练和验证
for phase in ['train', 'valid']:
if phase == 'train':
model.train() # 训练
else:
model.eval() # 验证
running_loss = 0.0
running_corrects = 0
# 把数据都取个遍
for inputs, labels in dataloaders[phase]:
inputs = inputs.to(device)
labels = labels.to(device)
# 清零
optimizer.zero_grad()
# 只有训练的时候计算和更新梯度
with torch.set_grad_enabled(phase == 'train'):
#resnet不执行这个
if is_inception and phase == 'train':
outputs, aux_outputs = model(inputs)
loss1 = criterion(outputs, labels)
loss2 = criterion(aux_outputs, labels)
loss = loss1 + 0.4 * loss2
else: # resnet执行的是这里
outputs = model(inputs)
loss = criterion(outputs, labels)
_, preds = torch.max(outputs, 1)
# 训练阶段更新权重
if phase == 'train':
loss.backward()
optimizer.step()
# 计算损失
running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)
epoch_loss = running_loss / len(dataloaders[phase].dataset)
epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)
time_elapsed = time.time() - since
print('Time elapsed {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))
print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))
# 得到最好那次的模型
if phase == 'valid' and epoch_acc > best_acc:
best_acc = epoch_acc
best_model_wts = copy.deepcopy(model.state_dict())
state = {
'state_dict': model.state_dict(),
'best_acc': best_acc,
'optimizer': optimizer.state_dict(),
}
torch.save(state, filename)
if phase == 'valid':
val_acc_history.append(epoch_acc)
valid_losses.append(epoch_loss)
scheduler.step(epoch_loss)
if phase == 'train':
train_acc_history.append(epoch_acc)
train_losses.append(epoch_loss)
print('Optimizer learning rate : {:.7f}'.format(optimizer.param_groups[0]['lr']))
LRs.append(optimizer.param_groups[0]['lr'])
print()
time_elapsed = time.time() - s
基于深度学习的花卉识别
需积分: 0 49 浏览量
更新于2023-06-26
6
收藏 757.76MB ZIP 举报
在当前的IT领域,深度学习已经成为了图像识别的主流技术,尤其在花卉识别这一细分应用中,它展现出了强大的性能。本项目以“基于深度学习的花卉识别”为主题,结合Python编程语言,旨在构建一个能够准确辨识各种花卉的智能系统。
深度学习是一种模仿人脑神经网络结构的机器学习方法,其核心在于多层非线性处理单元的大型神经网络模型。这些网络通常由输入层、隐藏层和输出层组成,每一层都包含大量的神经元。通过反向传播和梯度下降等优化算法,深度学习模型可以从大量数据中自动学习特征,从而实现对复杂模式的识别。
在花卉识别任务中,首先需要收集大量的花卉图像作为训练数据。这些数据通常会经过预处理,包括尺寸标准化、色彩空间转换(如RGB到灰度或HSV)以及数据增强(如翻转、旋转、缩放等),以增加模型的泛化能力。接下来,我们可以选择适合图像分类的深度学习模型,如卷积神经网络(CNN)。CNN因其在图像处理中的优异表现而广泛应用于图像识别任务,它能够自动学习并提取图像的局部特征。
在Python环境中,我们可以利用深度学习框架如TensorFlow、Keras或PyTorch来构建和训练模型。Keras是一个高级神经网络API,它可以在TensorFlow等后端上运行,提供简洁易懂的接口,使得模型搭建和训练过程更加直观。在Keras中,可以轻松定义CNN模型结构,包括卷积层、池化层、全连接层和激活函数等,并使用内置的优化器、损失函数和评估指标进行训练。
训练过程中,我们会设定一些超参数,如学习率、批次大小、训练轮数等,以找到最优的模型配置。同时,为了防止过拟合,可以采用正则化(如L1、L2)、Dropout或数据增强等技术。训练完成后,模型会保存为权重文件,以便后续的预测使用。
对于测试集上的花卉图像,模型会将其分类到预先定义好的类别中。为了提高用户体验,我们还可以开发一个简单的用户界面,让用户上传图片,系统即时返回花卉种类。此外,考虑到实际应用中可能会遇到未见过的花卉,模型的泛化性能至关重要,因此在模型设计和训练时应充分考虑这一因素。
“基于深度学习的花卉识别”项目涵盖了深度学习理论、Python编程、图像处理和模型训练等多个方面,通过实践可以深入理解这些知识,并掌握利用现代人工智能技术解决实际问题的能力。无论是对初学者还是专业人士,这都是一个极佳的学习和研究案例。
qq_57057483
- 粉丝: 0
- 资源: 1
最新资源
- 利用Python绘制带装饰物的圣诞树代码实现
- 计算机网络基础:从FTP到HTTP的网络协议详解
- 纸管音圈绕线机工程图机械结构设计图纸和bom和其它技术资料和技术方案非常好100%好用.zip
- 自动线圈导通测试机工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- SOME IP协议规范文档
- TIA博途Wincc下载时提示缺少面板映像的解决办法(无需安装更新包).docx
- 自动贴标撕膜检测机工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- Image Style Transfer Using Convolutional Neural Networks解析与复现
- TIA博途V17 -面板映像文件-UPD7-单独映像-链接地址.txt
- 4YQ690级埋弧焊焊接材料国内外对比试验 - .pdf
- 05超大直径焊接空心球类节点分析与设计.pdf
- 05高频焊接轻型H型钢在建筑工程中的应用.pdf
- 5A02铝合金与镀锌钢熔钎焊接头研究 - .pdf
- 5A04 LF4铝镁合金空气分馏塔的现场焊接技术.PDF
- 5A06铝合金薄板VPPA焊接工艺研究 - .pdf
- 5万m^3LNG储罐9Ni钢的焊接和质量控制.pdf