前言

随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。来源于哔哩哔哩博主“霹雳吧啦Wz”,博主学习作为笔记记录,欢迎大家一起讨论学习交流。

一、搭建EfficientNet网络

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、代码部分

1.module.py----定义EfficientNet的网络结构

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.train.py----加载数据集并进行训练,训练集计算loss,测试集计算accuracy,保存训练好的网络参数

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。

3.predict.py——得到训练好的网络参数后,用自己找的图像进行分类测试

在这里插入代码片

三、EfficientNet V1

efficientDet 训练代码指定gpu_深度学习

之前的论文是单独增加图像的分辨率、网络深度、以及网络的宽度探究的影响,EfficientNet是联合讨论输入图像的分辨率、网络深度和宽度的影响。

efficientDet 训练代码指定gpu_机器学习_02

a图是原始的基本图像,a-d分别是在a的基础上增加图像的宽度,深度和分辨率。宽度就是增加深度,即卷积核的个数。e是EfficientNet同时增加图像的深度、宽度和分辨率。

efficientDet 训练代码指定gpu_深度学习_03

增加深度会获得复杂、丰富的特征但是深度过深可能面临梯度消失,训练困难。增加宽度即卷积核的个数会获得高细粒度的特征但是对于宽度很大而深度很浅的网络很难学到更深层次的特征。增加网络分辨率,可以理解为图像越清晰,得到更高的细粒度特征,但是会增加计算量。

上图也表明同时增加深度、宽度和分辨率会有较好效果。在理论上,相同的FLOPs数目,计算量相同,也会效果更好。

efficientDet 训练代码指定gpu_ci_04

EfficientNet-B0 也是通过网络搜索技术得到的。

efficientDet 训练代码指定gpu_学习_05

一共有1-9个stage,stride可以通过分辨率进行得到:比如224x224到112x112,步距为2。分辨率是输入的分辨率。Ci表示输出通道数,Li表示每一个operator重复多少次。MBConv是Moblie Convolutional。

第一个模块步距为2,后面是1.

efficientDet 训练代码指定gpu_机器学习_06


efficientDet 训练代码指定gpu_学习_07

MB Conv和Mobilenet V3采用类似的结构。

第一个卷积层的卷积核的个数是输入特征矩阵channel的n倍。前面的Conv后面的数字就是这个n。

DW卷积输入和输出特征矩阵的通道数保持不变。

efficientDet 训练代码指定gpu_python_08

其实和MoblienetV3 SE模块也差不多,FC1的节点是输出矩阵channel的1/4,但是这里的输出矩阵是输入MB Conv模块的输入矩阵的channel,而FC2的节点是和输出矩阵的channel一样,要保证能够相乘,这里的Chanel是DW卷积之后的channel。两个全连接层之后的激活函数也不一样。

efficientDet 训练代码指定gpu_学习_09

EfficientNetB0-B7注意两个倍率因子,深度倍率因子和宽度倍率因子。

efficientDet 训练代码指定gpu_python_10

性能对比:准确率比较高、参数最小、FLOPS最小。输入图像分辨率比较大,占GPU内存。

三、EfficientNet V2