其他分享
首页 > 其他分享> > Keras基础

Keras基础

作者:互联网

人工智能

人类的大脑之所以被称为智能,是因为它拥有学习和分析的能力,我们可以通过观察身边的事物来学习他们的规律,然后根据这个规律对未知结果的问题给出答案。

“对未知结果的问题给出答案”这件事按照数学思想来分类,可以分为“预测”问题和“分类”问题。

在大多数情况下,生活中的问题的都可以逻辑化简为“预测”或者“分类”。

对计算机来说,我们输入的描述事物的数据就是它获取的信息。计算机要做到智能学习,就需要它在这些数据中寻找规律,并且通过这一规律来解决问题。

实现思路:

“规律”或者解决问题的“逻辑”在计算机中都表现为预测函数,即一连串的特征值到其对标签值的映射。也就是说,当计算机接收到一项数据的特征值(特征值需用数字来表示)时,会对这一连串特征值进行组合、变形,直到模拟出(即对应)一个可以代表标签值的输出。

可以通过调整预测函数的形式来使得输出的预测值更接近实际的标签值。

Keras

Keras 是一个深度学习框架,深度学习属于机器学习,机器学习是人工智能的一部分。它的底层是基于谷歌出的 TensorFlow、微软出的CNTK、还有一个Theano。本文用的是TensorFlow。

前置知识

  1. 全连接层

全连接层就是指这一层中的结点与上一层中的所有结点相连。
image

  1. Sequential()

Sequential 函数属于 keras.models 模块,可以用来搭建神经网络时添加网络层的容器。

有了这个容器,既可以在其中层层添加网络,自由地搭建属于自己的神经网络;也可以通过这个容器将搭建好的神经网络看作一个整体,规定它的训练方式。当完成训练后,可以将这个模型保存,它会记住每一层网络的具体参数。

Sequential 函数创建的模型叫做序贯模型,只允许线性堆叠多个网络层:神经网络中有且只有一个输入层,即 一个网络层前接的网络层有且只有一个,后接的网络层也如此。

还有一种模型叫做函数式模型,允许非线性堆叠网络,结构比较复杂,创建过程也挺复杂的,不过拟合效果很好。不过序贯模型已经能够很好解决大多数问题了。

  1. Dense()

Dense 函数属于 Keras.layers 模块,用来创建一个全连接层。

在没有输入特定参数 activation 的情况下,Dense 所作的运算就是将权重与对应的输入相乘,然后将所得乘积累加得到输入,即 线性运算。对应的预测函数 y 为线性函数。

Dense() 方法会创建并返回一个 Dense 层对象可以向 Dense() 中传入一些参数,来指明希望构造一个怎样的 Dense 层。

常用的参数有

  1. model.compile()方法

model.compile 函数用来编译模型。

编译模型:指定模型在学习训练数据时,怎样计算预测值和实际标签值的差距、使用什么方法减小这一差距、评价模型时采用怎样的标准。

3个参数:

在每一次数据集中的数据都被模型学习过之后(一个轮次的学习结束后),keras 会使用这些指标来评估目前模型的准确率,也会根据损失函数算出当前预测值与实际值的差距。

  1. model.fit()方法

model.fit 函数用来训练模型。

第一个参数传入特征值 x_train,第二个参数传入对应的标签值 y_train。

  1. model.evaluate()方法

model.evaluate 函数会根据本次预测的结果,对模型进行评价并返回一个分数,评判的指标与 compile() 方法中 metrics 参数定义的指标一致。

小样例

from keras.models import Sequential # Sequential函数用来创建一个keras模型,即搭建神经网络时添加网络层的容器。有了这个容器,既可以在其中层层添加网络,自由地搭建属于自己的神经网络;也可以通过这个容器将搭建好的神经网络看作一个整体,规定它的训练方式。当完成训练后,可以将这个模型保存,它会记住每一层网络的具体参数
from Keras.layers import Dense # Dense函数用来创建一个全连接层。在没有输入特定参数activation的情况下,Dense所作的运算就是将权重与对应的输入相乘,然后将所得乘积累加得到输入,即线性运算;对应的预测函数 y 为线性函数
import numpy as np # numpy将python中普通的列表转化成便于keras处理的数学形式——张量tensio

# 载入数据,并进行预处理(转换成张量)
x_train = [1,2,3,4,5] # 训练数据的输入部分
y_train = [2,3,4,5,6] # 训练数据的标签值部分。可以看出需要拟合的函数y=x+1是一个线性函数,即标签值是对特征值经行线性运算后得到的
x_train = np.array(x_train)
y_train = np.array(y_train)

model = Sequential() # Sequential函数建立序贯模型
# 添加网络层
model.add(Dense(units=1, input_shape=(1,), use_bias=True)) # 添加第一层网络。输入的是一个一维数组,所以 input_shape=(1,)。希望通过模型预测出一个y值,所以 units=1。规定该层网络有偏置项 bias
model.add(Dense(1, use_bias=True))
model.add(Dense(1, use_bias=True))
# 编译模型
model.compile(loss='mse', optimizer='sgd', metrics=['acc']) # 损失函数求每个原始数据与对应预测数据的差的平方,然后对得到的结果求均值。优化器选择sgd(随机梯度下降算法),每学习一批数据就利用损失函数计算一次误差值,并据此更改参数。每轮次训练结束后都输出估计样本值的正确率来评估该模型目前的质量
# 训练模型
model.fit(x_train, y_train, batch_size=5, epoch=50)
score = model.evaluate(x_train, y_train, batch_size=5) # 将之前的训练数据再输入到模型中,让它对此作出预测。model.evaluate()函数会根据本次预测的结果,对模型进行评价并返回一个分数,评判的指标与 compile() 方法中 metrics 参数定义的指标一致
test_data = model.predict(np.array([[5]]), batch_size=1) # 传入一个特征值参数,会返回对应的预测值
print(test_data)
print(score)

可以在结果中看到 每一个 epoch 结束后,会显示当前模型的损失值 loss 和正确率 acc。

如果对这个结果不满意,可以改进一下代码,增加前两个网络层的 units ,比如第一个网络层中 units=5,第二个网络层中 units=3,这样就大大增加了隐藏层的复杂性,同时增加了模型的拟合能力,而输出层只输出一个预测这一点有没有改变。宠幸运行观察结果,可以看到损失函数输出的误差值减小了。

标签:Dense,函数,Keras,模型,基础,train,model,输入
来源: https://www.cnblogs.com/Jojo-L/p/16537359.html