Keras基础
作者:互联网
人工智能
人类的大脑之所以被称为智能,是因为它拥有学习和分析的能力,我们可以通过观察身边的事物来学习他们的规律,然后根据这个规律对未知结果的问题给出答案。
“对未知结果的问题给出答案”这件事按照数学思想来分类,可以分为“预测”问题和“分类”问题。
在大多数情况下,生活中的问题的都可以逻辑化简为“预测”或者“分类”。
对计算机来说,我们输入的描述事物的数据就是它获取的信息。计算机要做到智能学习,就需要它在这些数据中寻找规律,并且通过这一规律来解决问题。
实现思路:
-
向计算机输入包括着特征值和标签值的训练数据,然后计算机从中学习两者之间的关系
-
再向计算机中输入一批测试数据,根据其特征值,得出预测值,然后再通过比较预测值和实际值之间的差距给规律的正确性“评分”
“规律”或者解决问题的“逻辑”在计算机中都表现为预测函数,即一连串的特征值到其对标签值的映射。也就是说,当计算机接收到一项数据的特征值(特征值需用数字来表示)时,会对这一连串特征值进行组合、变形,直到模拟出(即对应)一个可以代表标签值的输出。
-
对特征值进行组合、变形使其对应一个预测标签值的过程,叫做映射或函数
-
对特征值进行怎样的组合、变形就是一个函数的形式
可以通过调整预测函数的形式来使得输出的预测值更接近实际的标签值。
Keras
Keras 是一个深度学习框架,深度学习属于机器学习,机器学习是人工智能的一部分。它的底层是基于谷歌出的 TensorFlow、微软出的CNTK、还有一个Theano。本文用的是TensorFlow。
前置知识
- 全连接层
全连接层就是指这一层中的结点与上一层中的所有结点相连。
- Sequential()
Sequential 函数属于 keras.models 模块,可以用来搭建神经网络时添加网络层的容器。
有了这个容器,既可以在其中层层添加网络,自由地搭建属于自己的神经网络;也可以通过这个容器将搭建好的神经网络看作一个整体,规定它的训练方式。当完成训练后,可以将这个模型保存,它会记住每一层网络的具体参数。
Sequential 函数创建的模型叫做序贯模型,只允许线性堆叠多个网络层:神经网络中有且只有一个输入层,即 一个网络层前接的网络层有且只有一个,后接的网络层也如此。
还有一种模型叫做函数式模型,允许非线性堆叠网络,结构比较复杂,创建过程也挺复杂的,不过拟合效果很好。不过序贯模型已经能够很好解决大多数问题了。
- Dense()
Dense 函数属于 Keras.layers 模块,用来创建一个全连接层。
在没有输入特定参数 activation 的情况下,Dense 所作的运算就是将权重与对应的输入相乘,然后将所得乘积累加得到输入,即 线性运算。对应的预测函数 y 为线性函数。
Dense() 方法会创建并返回一个 Dense 层对象可以向 Dense() 中传入一些参数,来指明希望构造一个怎样的 Dense 层。
常用的参数有
-
units:一个正整数,它代表了该层有几个输出,即输出数据(可以理解为由输出值组成的向量)的维度。
必选参数,可以直接将 n 作为第一个参数传入 -
input_shape:一个正整数,代表该层输入数据的维度
-
input_dim:值一般形为(n, m, ……, k, )。k 后面多了一个逗号,代表 input_shape 的值必须为一个 python 元组
在向模型添加第一层网络时,input_shape是一个必选参数,其余时候可以选择不传入这个参数,此时输入张量的形状将会和上一层的输出张量一致例如 input_shape=(3,3,4,)表示每一个输入数据的形状为(3,3,4)
-
use_bias:一个布尔值(Ture/False),通过指定它为真或为假来规定该层网络是否有偏置项 bias
- model.compile()方法
model.compile 函数用来编译模型。
编译模型:指定模型在学习训练数据时,怎样计算预测值和实际标签值的差距、使用什么方法减小这一差距、评价模型时采用怎样的标准。
3个参数:
-
loss:指定计算预测值和实际标签值之间差距的方法。这种方法通常是一个函数,函数输入值为预测值和实际值,通过对输入进行运算得出输出值——两者的差距(损失值)。这个函数就是所谓的损失函数/目标函数。
可以对输入值进行不同的运算,如直接做减法、做减法后对差求平方等;虽然它们都能体现误差,但是计算形式不一样。在keras中,loss参数可以是一个 keras 预定义的损失函数名(它是一个字符串);也可以是自定义的函数,这个函数的返回值可以是一个张量或者一个字典。一般通过调用预定义的损失函数就可以解决绝大多数问题了。- 预定义的损失函数有 mse、mae、mape、categorical_crossentropy、binary_crossentropy 等
-
optimizer(优化器):指定减小误差的方法。它可以是keras预定义的优化器名字(字符串),也可以是一个自定义的优化器对象。
- keras预定义的优化器名字有 sgd、RMSprop、Adagrad 等
-
metrics:规定评价模型时采用的标准,它是一个列表。列表里可以是预定义好的各项指标的名字(字符串),也可以是自定义的评估函数。
在每一次数据集中的数据都被模型学习过之后(一个轮次的学习结束后),keras 会使用这些指标来评估目前模型的准确率,也会根据损失函数算出当前预测值与实际值的差距。
- model.fit()方法
model.fit 函数用来训练模型。
第一个参数传入特征值 x_train,第二个参数传入对应的标签值 y_train。
-
epochs:规定训练结束的条件
如果一个数据集中的每一个数据都被送入模型中进行学习了一次,称这是该数据集上的一次迭代,也就是说模型学习了整个数据集一次。
epochs = n,表示模型学习了整个数据集 n 次后停止训练和学习。 -
batch_size:更新预测函数权重的条件
batch_size = n,规定每学习n个数据后,就更新一次预测函数中的权重
- 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