百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

原来深度学习模型搭建可以像累砖一样简单

bigegpt 2024-11-10 08:26 3 浏览

本文内容参考《深度学习计算机视觉实战》,该书内容包括深度学习与计算机视觉基础介绍、常用的OpenCV进行模型训练前处理与后处理算法、计算机视觉案例实战、Windows/Linux/Android/国产化平台的模型部署,学习路线如下:

Keras是最常见的深度学习库之一,能够帮助用户快速构建深度学习网络。Keras的张量计算依赖于处理后端,Keras中提供了Theano/Tensorflow/CNTK三种后端引擎,三种引擎的函数使用统一封装,在用户层面可以切换后端引擎,但是调用的API相同。

Keras提供了丰富的API用于模型的搭建与训练,本节介绍常用API,用户若想深入了解可以参考官方文档。

1 Keras模型

Keras中提供两种模型构建方法:构建顺序模型和使用函数式API构建的Model类模型。

顺序模型是网络层的线性叠加,使用Sequential()函数创建,可以将网络的层当做参数传入,如下所示传入了四个层,Conv2D(卷积层),Activation(激活层),Dense(全连接层),Activation(激活层)。

from keras.models import Sequential
from keras.layers import Conv2D, Dense, Activation
model = Sequential([
Conv2D(3, (3, 3), padding='same')(inputs),
Activation('Relu'),
Dense(10),
Activation('softmax'),
])

也可以创建一个空的模型,向里面添加层。

model = Sequential()
model.add(Conv2D(3, (3, 3), padding='same')(inputs))
model.add(Activation('Relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

上面两种创建顺序模型的方式是等价的,使用顺序模型可以一层层的叠加模型的层。

函数式API的Model类模型由keras.Model()创建。

inputs = keras.Input(shape=(3,))
x = keras.layers.Dense(784, activation='Relu')(inputs)
outputs = keras.layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)

除了这两种模型之外,还可以继承Keras.Model定制化创建自己的模型,这种方式具有更大的灵活性。

2 Keras层

Keras的层由keras.layers引入,常用的层有Conv2D,Dense,Activation,Input、MaxPooling2D、BatchNormalization、AveragePooling2D、Dropout、AveragePooling2D。

Conv2D:提供二维的卷积功能。

Dense:提供w*x+b的功能,和全连接类似。

Activation:提供激活函数功能。

Input:提供输入函数。

MaxPooling2D:提供最大池化功能。

AveragePooling2D:提供平均池化功能。

BatchNormalization:提供归一化功能。

Dropout:对输入应用Dropout功能。

这些函数层都是类的形式定义,传入的参数会初始化类成员,然后调用后端对应的功能函数,以MaxPooling2D为例,调用如下。

class MaxPooling2D(_Pooling2D):
@interfaces.legacy_pooling2d_support
def __init__(self, pool_size=(2, 2), strides=None, padding='valid',
data_format=None, **kwargs):
super(MaxPooling2D, self).__init__(pool_size, strides, padding,
data_format, **kwargs)
def _pooling_function(self, inputs, pool_size, strides,
padding, data_format):
output = K.pool2d(inputs, pool_size, strides,
padding, data_format,
pool_mode='max')
return output

MaxPooling2D传入的参数就是池化核大小pool_size,步长strides,padding的类型padding,数据类型data_format。在_pooling_function中调用某一个后端的pool2d函数。

Linux系统中可以在$HOME/.keras/keras.json中找到Keras配置文件,如果是Windows则是在%USERPROFILE%/.keras/keras.json中保存配置文件,内容如下所示:

{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}

可以在这里修改后端为"tensorflow","theano" 和 "cntk"中的一个,也可以使用用户自定义的后端,自定义后端需要定义了placeholder、variable以及function三个函数,否则会报后端无效的错误。

用户也可以通过设置环境变量KERAS_BACKEND来改变后端,设置之后会修改配置文件中的后端设置值。

3 模型编译

Keras中模型编译是通过compile方法完成的,如下所示,常用的三个参数为优化器optimizer,损失函数loss以及评价函数metrics。

model.compile(optimizer='rmsprop',
loss='mse',
metrics=['accuracy'])

开发者还可以根据需要设置其他的参数,compile的函数定义如下:

def compile(self,
optimizer, #优化器
loss=None, #损失函数
metrics=None, #评价函数
loss_weights=None, #指定不同损失函数的权重
sample_weight_mode=None, #采样权重模式
weighted_metrics=None, #加权评估标准
target_tensors=None, #指定自己的目标张量
**kwargs)

optimizer中提供了八种可选的优化器的类型:SGD、RMSprop、Adam、Adadelta、Adagrad、Adamax、Nadam、Ftrl。

loss为模型训练定义的损失函数,用户可以选择已有的损失函数,也可以自定义损失函数。使用时根据分类或者回归任务的不同选择不同的损失函数,如分类任务中常用的交叉熵损失函数keras.losses.categorical_crossentropy。如果模型具有多个输出,对应的多个损失函数可以通过字典或列表进行参数传递,这样在每个输出上使用不同的损失,最终的最小化损失是最小化所有输出损失的总和。

metrics为评价函数,用于评估当前训练模型的性能,是模型训练和测试期间的评估标准,如使用准确率作为标准可以传入metrics = ['accuracy'],对于多输出模型可以用字典传递不同的评价函数。

4 模型训练

Keras模型训练使用fit函数。

model.fit(inputs, labels, epochs=10, batch_size=32)

如上面的调用传入了输入数据inputs,标签labels,训练轮次10轮,每一次梯度更新使用的样本数量大小为32(即batch的大小)。

fit函数还可以设置其他的参数,函数的定义如下:

def fit(self,
x=None, #输入数据
y=None, #标签label
batch_size=None, #训练batch大小
epochs=1, #训练轮次
verbose=1, #日志输出的方式
callbacks=None, #回调函数
validation_split=0., #验证集的比例
validation_data=None, #验证集
shuffle=True, #是否打乱样本顺序
class_weight=None, #为不同类别设置不同的权重
sample_weight=None, #样本加权
initial_epoch=0, #从指定epoch开始训练
steps_per_epoch=None, #每个epoch的步数
validation_steps=None, #若steps_per_epoch被指定,表示验证集上step总数
validation_freq=1, #验证集验证频次
max_queue_size=10, #生成器序列的最大值
workers=1, #最大线程数
use_multiprocessing=False, #是否多线程
**kwargs)

在训练的过程中可以根据需要选择合适的参数,例如是否需要使用验证集做验证,是否打乱输入数据,以及根据训练机器的性能选择是否使用多线程和设置最大的线程数。

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...