当前位置: 首页 > news >正文

迁移学习代码复现

一、前言

说来可能令人难以置信,迁移学习技术在实践中是非常简单的,我们仅需要保留训练好的神经网络整体或者部分网络,再在使用迁移学习的情况下把保留的模型重新加载到内存中,就完成了迁移的过程。之后,我们就可以像训练普通神经网络那样训练迁移过来的神经网络了。
我们使用已经训练好的大型图像分类卷积神经网络来做一个分类任务:区分画面上的动物是蚂蚁还是蜜蜂

二、数据导入

将蚂蚁蜜蜂数据集进行一些(增强)图形处理,如随机从原始图像中切下来一块224×224大小的区域,随机水平翻转图像,将图像的色彩数值标准化等等。数据增强的目的是:增强模型的鲁棒性,提高模型的泛化能力和性能。

1、导入相应的函数库

# 加载程序所需要的包
#import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np
import torchvision
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import copy
import os

导入蚂蚁蜜蜂数据集,并将这些照片进行一定的照片增强处理,最后以data_loader的形式存储。注:该代码是在kaggle上进行训练,所以data_dir是kaggle中input存储的位置,运行时,需根据具体情况修改文件路径。

# 数据存储总路径
data_dir = '/kaggle/input/bees-and-ants/蚂蚁蜜蜂数据集'
# 图像的大小为224×224
image_size = 224
# 加载的过程将会对图像进行如下增强操作:
# 1. 随机从原始图像中切下来一块224×224大小的区域
# 2. 随机水平翻转图像
# 3. 将图像的色彩数值标准化
train_dataset = datasets.ImageFolder(os.path.join(data_dir, 'train'),transforms.Compose([transforms.RandomResizedCrop(image_size),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]))# 加载校验数据集,对每个加载的数据进行如下处理:
# 1. 放大到256×256
# 2. 从中心区域切割下224×224大小的区域
# 3. 将图像的色彩数值标准化
val_dataset = datasets.ImageFolder(os.path.join(data_dir, 'val'),transforms.Compose([transforms.Resize(256),transforms.CenterCrop(image_size),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]))
# 创建相应的数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size = 4, shuffle = True, num_workers=4)
val_loader = torch.utils.data.DataLoader(val_dataset, batch_size = 4, shuffle = True, num_workers=4)
# 读取得出数据中的分类类别数
num_classes = len(train_dataset.classes)

2、展示部分照片

数据存储在train_loader(val_loader)的迭代器中,其中imgs是以数字的形式展示。在 PyTorch 中,图像数据通常以 (C, H, W) 的顺序存储,其中 C 是颜色通道数(例如 RGB 的 3 个通道),H 是图像的高度,W 是图像的宽度。然而,matplotlib 的 imshow 函数期望的图像数据是 (H, W, C) 顺序的,即高度和宽度作为前两个维度,颜色通道作为最后一个维度。所以img_np是通过通道转换后的照片(同时也通过Normalize标准化后的照片),imgs[0][0]是灰度的照片。

imgs,label=next(iter(train_loader))
fig,ax=plt.subplots(1,2,figsize=(12,6))
# 展示标准化后的照片
img_np = imgs[0].permute(1, 2, 0).numpy()
ax[0].imshow(img_np)
# 展示标准化后的照片
ax[1].imshow(imgs[0][0])
plt.show()

原图如下:
在这里插入图片描述
图如下:
在这里插入图片描述

三、使用自定义的模型进行训练

1、定义模型

自定义卷积神经网络模型,并确定前向传播每层之间的连接方式。

# 使用自定义的CNN模型
depth = [4, 8]
class ConvNet(nn.Module):def __init__(self):super(ConvNet, self).__init__()self.conv1 = nn.Conv2d(3, 4, 5, padding = 2) #输入通道为3,输出通道为4,窗口大小为5,padding为2self.pool = nn.MaxPool2d(2, 2) #一个窗口为2*2的pooling运算self.conv2 = nn.Conv2d(depth[0], depth[1], 5, padding = 2) #第二层卷积,输入通道为depth[0], 输出通道为depth[1],窗口为15,padding为2
http://www.lryc.cn/news/426744.html

相关文章:

  • Elasticsearch(ES)常用命令
  • C/C++ 不定参函数
  • C语言——函数专题
  • springboot打可执行jar包
  • 【SQL】科目种类
  • 【深度学习】【语音】TTS,最新TTS模型概览,扩散模型TTS,MeloTTS、StyleTTS2、Matcha-TTS
  • 【论文笔记】LION: Linear Group RNN for 3D Object Detection in Point Clouds
  • 打造高可用集群的基石:深度解析Keepalived实践与优化
  • Web大学生网页作业成品——环保主题介绍网页网站设计与实现(HTML+CSS)(5个页面)
  • Qt登录窗口设计
  • 探索数据矿藏:我的AI大模型与数据挖掘实战经验分享
  • linux C语言strcat函数及相关函数
  • 使用 sort 进行文本文件处理
  • HarmonyOS笔记4:从云数据库获取数据
  • QT5生成独立运行的exe文件
  • LabVIEW光纤水听器闭环系统
  • Shell——流程控制语句(if、case、for、while等)
  • 【redis的大key问题】
  • HighPoint SSD7749M2:128TB NVMe 存储卡实现28 GB/s高速传输
  • ARM 裸机与 Linux 驱动对比及 Linux 内核入门
  • 0101DNS TCP fallback on UDP query timeout disabled-redission-中间件
  • 位运算
  • MemFire Cloud是否真的可以取代后端
  • 数据结构(邓俊辉)学习笔记】优先级队列 06——完全二叉堆:批量建堆
  • Java | Leetcode Java题解之第344题反转字符串
  • 定制开发AI智能名片O2O商城小程序:基于限量策略与个性化追求的营销创新
  • Spring MVC Controller返回json日期格式配置失效的解决办法
  • 3.Default Constructor的构造操作
  • CSS的:current伪类:精准定位当前活动元素
  • 搭建个人网站