Keras实验教程1:入门实践

前言:最近面试发现DL真的很重要,许多岗位尤其是CV,DL是必须要掌握的,而且至少掌握两个DL框架。遂把去年做的Keras翻出来温习一下。内容浅显,大多摘自官方或者从网络上搜罗而来。难免存在纰漏,敬请各位看官指正!

1.入门实践

1.1 Keras基本概述

Keras是一个高层神经网络API,由纯Python编写而成并基于Tensorflow和Theano以及CNTK后端。Keras为支持快速实验而生,具有高度模块化,极简和可扩充的特性。Keras具有简易和快速的原型设计,并支持卷积神经网络CNN和循环神经网络RNN,或二者的结合,以及在CPU和GPU之间无缝切换。

Keras的基本网络框架结构大致由后端、模型、层构成。

  • backend:后端。对Tensorflow和Theano进行封装,完成低层的张量运算、计算图编译等。
  • models:模型。模型是层的有序组合,也是层的“容器”,是“神经网络”的整体表示。
  • layers:层。神经网络的层本质上规定了一种从输入张量到输出张量的计算规则,显然,整个神经网络的模型也是这样一种张量到张量的计算规则,因此可以说keras的model是layer的子类。

上面的三个模块是Keras最为要紧和核心的三块内容,搭建一个神经网络,至少需要上述三部分模块。需要注意的是,backend虽然很重要,但其内容多而杂,大部分内容都是被其他keras模块调用,而不是被用户直接使用。鉴于backend学习难度较高,对于新手初学Keras不妨先将backend放一旁,从model和layers学起。

图1 keras框架的基本概念
Keras最常用的目的是用来构建神经网络,所谓网络其实是一个由多个子计算图构成的大计算图。每一个子计算图通常用层(layer)来表达,后文将详细对layer展开详细说明,此处先给出对神经网络模型的宏观认知。当子计算图是顺序连接时,称之为顺序式模型(Sequential),否则称之为泛型模型,又称为函数式模型(Model)。
为了训练神经网络,必须定义一个神经网络优化的目标和一套参数更新的方式,这部分就是目标函数和优化器:目标函数(objectives),规定了神经网络的优化方向,优化器(optimizers),规定了神经网络的参数如何更新。
上面的两个模块的内容,是在训练一个网络时必须提供的。此外,Keras提供了一组模块用来对神经网络进行配置:

  • initialization:初始化策略,规定了网络参数的初始化方法
  • regularizers:正则项,提供了一些用于参数正则的方法,以对抗过拟合
  • constraints:约束项,提供了对网络参数进行约束的方法
  • 为了方便调试、分析和使用网络,处理数据,Keras提供了下面的模块:
  • callbacks:回调函数,在网络训练的过程中返回一些预定义/自定义的信息
  • visualization:可视化,用于将网络结构绘制出来,以直观观察
  • preprocessing:提供了一组用于对文本、图像、序列信号进行预处理的函数
  • utils:常用函数库,一般很少用到,其中比较重要的是utils.np_utils中用于将1D标签转为one-hot的2D标签的to_categorical函数和用于将卷积核在theano模式和Tensorflow模式之间转换的convert_kernel函数。
  • datasets:提供了一些常用数据库的接口,用户将通过这些接口下载和载入数据集。

另外Keras也提供了wrappers.scikit-learn 模块来与scikit-learn进行联动。
值得注意的是,在构建模型的过程中最核心的函数有两个:
compile:编译。模型在训练前必须编译,这个函数用于完成添加正则项,确定目标函数,确定优化器等一系列模型配置功能。此函数必须指定的参数是优化器(optimizer)和目标函数(又称损失函数,loss),但通常还需要指定一个评价指标(metrics)来评价模型。
fit和fit_generator:训练。参数较多,包括训练样本x_train,y_train,训练每批包含的样本个数batch_size和训练次数epochs等等,是需要重点掌握的函数。
对于神经网络的训练和评估,keras提供了两套函数,一套是fit和evaluate等,另一套是fit_generator和evaluate_generator。前者适用于普通情况,后者适用于数据是以迭代器动态生成的情况。迭代器可以在内存/显存不足,实时动态数据提升进行网络训练,迭代器很重要,是学习keras一定要掌握好的内容。

另外,为了更快速的理解网络的输入输出、编译和训练的具体内容,以下给出一些基本概念。
a. 符号计算
符号主义的计算首先定义各种变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。建立好的计算图需要编译以确定其内部细节,然而,此时的计算图还是一个“空壳子”,里面没有任何实际的数据,只有当你把需要运算的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。
b. 张量
张量(tensor)这个词汇的引入目的是为了表述统一,张量可以看作是向量、矩阵的自然推广,我们用张量来表示广泛的数据类型。给个简单的开拓式理解:
规模最小的张量是0阶张量,即标量,也就是一个数。
当我们把一些数有序的排列起来,就形成了1阶张量,也就是一个向量
如果我们继续把一组向量有序的排列起来,就形成了2阶张量,也就是一个矩阵
把矩阵摞起来,就是3阶张量,我们可以称为一个立方体,具有3个颜色通道的彩色图片就是一个这样的立方体
把立方体摞起来,我们没有再给它起别名了,称之为4阶张量了,不要去试图想像4阶张量是什么样子,它就是个数学上的概念。

c. batch_size
由于训练数据过大而采用分批取数据进行训练,把数据分为若干个批,按批来更新参数。batch_size表示训练过程中每批输入的样本个数。
d. Epochs
epochs指的是将数据训练的轮次。

1.2 Keras神经网络模型的构造:5步法

  • 1.构造网络模型
  • 2.编译模型
  • 3.训练模型
  • 4.评估模型
  • 5.使用模型进行预测

在这里插入图片描述

1.3 四个基本概念

1)网络结构
2)激活函数
3)损失函数

  • categorical_crossentropy 多分类交叉熵
  • binary_crossentropy 二分类交叉熵
  • mean_squared_error 均方差损失
  • mean_absolute_error 平均绝对值损失

4)优化器

  • SGD随机梯度下降
  • RMSProp
  • Adagrad自适应梯度下降
  • Adam
  • Adadelta

1.4 九种基本层

1)3种主模型:
全连接层Dense ;
卷积层:如conv1d, conv2d
循环层:如lstm, gru
2)3种辅助层:
Activation层
Dropout层
池化层:包括MaxPooling1D,MaxPooling2D等
3)3种异构网络互联层:
Embedding层:用于第一层,输入数据到其他网络的转换
Flatten层:用于卷积层到全连接层之间的过渡
Permute层:用于RNN与CNN之间的接口

# coding=utf-8
#[1] 导入相关依赖
import numpy as np
np.random.seed(1271)
from keras.models import Sequential #深度学习的模型
from keras.layers import Dense #层的输入输出
import matplotlib.pyplot as  plt #绘图

#[2] 使用numpy生成样本数据
x=np.linspace(-1,1,200) #-1,1之间切割200份
np.random.shuffle(x) #打乱顺序
y=0.5*x+2+np.random.normal(0,0.05,(200,)) #y与x,插入一个随机数矩阵

#绘制训练样本散点图
plt.figure()
plt.scatter(x,y)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

x_train,y_train=x[:160],y[:160]  #切割,测试,训练
x_test,y_test=x[160:],y[160:]

#[3] 建立模型
model=Sequential()
model.add(Dense(input_dim=1,units=1)) #输入为1,输出为1

#[4] 编译
model.compile(loss="mse",optimizer="sgd" )#设定损失函数,设定优化

#[5] 训练
print("训练-------------")
for step in range(301):
    cost=model.train_on_batch(x_train,y_train)
    if step%100==0:
        print("训练结果",cost)

##训练300次
# cost=model.fit(x_train,y_train,batch_size=40,epochs=300)

#[6] 测试
print("测试-------------")
cost=model.evaluate(x_test,y_test,batch_size=40)  #训练
print("测试结果",cost)
w,b=model.layers[0].get_weights() #抓取斜率截距
print("w=",w,"b=",b)

#[7] 预测
y_new=model.predict(x_test)
plt.figure()
plt.scatter(x_test,y_test) #测试数据散点图
plt.plot(x_test,y_new) #预测的直线图
plt.xlabel('x')
plt.ylabel('y')
plt.savefig('predict.png')
plt.show()

实验结果:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值