keras入门学习笔记

keras入门

https://cnbeining.github.io/deep-learning-with-python-cn/

安装环境

基本环境

  • python2.7
  • numpy-1.14.3 python科学计算的基础包,它提供了多维数组对象、基于数组的各种派生对象,矩形运算的模块
  • scipy-1.1.0 基于numpy,有一些高阶抽象和物理模型,比如傅里叶变换在numpy就可以,但是如果要做一个滤波器就需要scipy了
  • matplotlib-2.2.2 python的2d绘图库,类似js中的d3.js
  • pandas-0.22.0 提供了一套名为DAtaFrame的数据结构,可以理解为表格+时间戳
  • scikit-learn-0.19.1 提供了很多机器学习的算法。它解决问题的步骤:数据准备与预处理、模型选择与训练、模型验证与参数调优

这几个库的安装方式是pip install numpy scipy matplotlib pandas scikit-learn

安装TensorFlow

这个TensorFlow不支持windows,安装命令:
pip install TensorFlow

安装Keras

pip install keras

python -c "import keras; print keras.__version__"

用来查看版本

配置Keras的后端,在1.x版本里面默认的后端是Theano,但是我安装的时候默认就是TensorFlow,如果大家的不是,需要修改一下,通过~/.keras/keras.json可以查看

使用Keras搭建深度学习模型

使用Keras的目的在于,Keras是TensorFlow的封装,降低了复杂性,Keras是最小化、模块化的封装,可以迅速上手,Keras可以通过定义-编译-拟合进行搭建模型,进行预测

Keras的目标就是搭建模型,最主要的模型就是Sequential:不同层的叠加。模型创建好了之后可以编译,调用后端进行优化,可以执行优化算法和损失函数。

一般的步骤:

  • 定义模型:创建Sequential模型,加入每一层
  • 模型编译:指定损失函数和优化算法,使用模型的compile()方法
  • 拟合数据:使用模型的fit()进行拟合数据
  • 进行预测:使用模型的evaluate()和predict()方法进行预测

一般的问题有二分类问题、多分类问题和回归问题

扫描二维码关注公众号,回复: 2789291 查看本文章

看一个例子

使用皮马人糖尿病数据集(Pima Indians onset of diabetes)。数据集的内容是皮马人的医疗记录,以及过去5年内是否有糖尿病。所有的数据都是数字,问题是(是否有糖尿病是1或0),是二分类问题。数据的数量级不同,有8个属性:

  • 怀孕次数
  • 2小时口服葡萄糖耐量试验中的血浆葡萄糖浓度
  • 舒张压(毫米汞柱)
  • 2小时血清胰岛素(mu U/ml)
  • 体重指数(BMI)
  • 糖尿病血系功能
  • 年龄(年)
  • 类别:过去5年内是否有糖尿病

所有的数据都是数字,可以直接导入Keras,前5行如下:

6,148,72,35,0,33.6,0.627,50,1
1,85,66,29,0,26.6,0.351,31,0
8,183,64,0,0,23.3,0.672,32,1
1,89,66,23,94,28.1,0.167,21,0
0,137,40,35,168,43.1,2.288,33,1

基准准确率是65.1%,在10次交叉验证中最高的正确率是77.7%

我们整体看一下代码:

# 引入Keras的模型和层
from keras.models import Sequential
from keras.layers import Dense
# 引入矩形运算的库
import numpy
# 使用随机梯度下降时使用固定种子,这样每次代码运行之后结果是一样的
seed = 7
numpy.random.seed(seed)
# 导入结构化数据,输入变量是8个,输出变量是一个
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# X表示0~8之间为输入,Y表示第8列是输出
X = dataset[:,0:8]
Y = dataset[:,8]
# 创建模型,然后一层层加入神经元
# 网络层是可以设置不一样的,这里使用的是常用的Dense全链接层,所实现的运算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵,bias为偏置向量,只有当use_bias=True才会添加
# Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu') 其中12代表这一层的输出维度,在创建模型时用input_dim参数确定。例如,有8个输入变量,就设成8。kernel_initializer表示初始化方式,uniform表示0~0.05的连续均匀分布,也可以使用normal表示高斯分布。activation是激活函数,relu表示是线性整流函数,sigmoid表示S型函数。
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu')) 
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# 编译模型,Keras会调用Theano或者TensorFlow编译模型。后端会自动选择表示网络的最佳方法,配合我们的硬件,这步需要定义几个新的参数。训练神经网络的意义是:找到最好的一组权重,解决问题。
# 编译时需要定义损失函数和优化算法,以及需要收集的数据。损失函数使用binary_crossentropy,优化算法使用adam
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model
# 训练模型,按照轮训练,数据跑150轮,每次10个数据
model.fit(X, Y, nb_epoch=150, batch_size=10)
# 测试模型,把测试数据拿出来检验一下模型的效果。注意这样不能测试在新数据的预测能力。应该将数据分成训练和测试集,调用模型的evaluation()方法,传入训练时的数据。输出是平均值,包括平均误差和其他的数据,例如准确度
scores = model.evaluate(X, Y)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

优化

测试数据

上一节只是比较简单的处理模型,并且没有区分测试集和数据集,为了更好的测试我们一般可以使用K折交叉验证

机器学习的金科玉律就是K折验证,来验证模型未来的预测能力,方法就是把数据分为K组,但是留下1组作为验证,其他数据用来训练模型

scikit-learn有StratifiedKFold类,我们用它把数据分成10组。抽样方法是分层抽样,尽可能保证每组数据量一致。然后我们在每组上训练模型,使用verbose=0参数关闭每轮的输出。训练后,Keras会输出模型的性能,并存储模型

# MLP for Pima Indians Dataset with 10-fold cross validation
from keras.models import Sequential
from keras.layers import Dense
from sklearn.cross_validation import StratifiedKFold
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# define 10-fold cross validation test harness
kfold = StratifiedKFold(y=Y, n_folds=10, shuffle=True, random_state=seed)
cvscores = []

for i, (train, test) in enumerate(kfold):
    # create model
    model = Sequential()
    model.add(Dense(12, input_dim=8, init='uniform', activation='relu')) 
    model.add(Dense(8, init='uniform', activation='relu'))
    model.add(Dense(1, init='uniform', activation='sigmoid'))
     # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
     # Fit the model
    model.fit(X[train], Y[train], nb_epoch=150, batch_size=10, verbose=0)
    # evaluate the model
    scores = model.evaluate(X[test], Y[test], verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 
    cvscores.append(scores[1] * 100)
    print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))

非数字的变量编码

因为数据中可能不一定是数字,可能是字符,这种情况可以使用scikit-learn的LabelEncoder可以将类别变成数字,然后用Keras的to_categorical()函数编码

from keras.utils import np_utils
from sklearn.preprocessing import LabelEncoder
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)

调整拓扑结构

我们上面的例子中,一共有3层,每层节点为12、8、1。我们可以增加一层,或者在层上面增加节点来看效果。

保存模型

可以使用h5py保存模型,格式有JSON和YAML

sudo pip install h5py

使用的函数是:to_yaml()model_from_yaml()

可视化

Keras支持回调API,其中默认调用History函数,每轮训练收集损失和准确率,如果有测试集,也会收集测试集的数据,利用History函数就可以来可视化数据

# Visualize training history
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
history = model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, verbose=0) # list all data in history
print(history.history.keys())
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left') 
plt.show()
# summarize history for loss plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('model loss')
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left') 
plt.show()

上面的这些知识冰山一角,还有很多等着大家去探索~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一些概念

Sequential 序贯模型,单输入单输出,层和层之间只有相邻关系,没有跨层链接

sample 样本

batch 深度学习的算法,最好的办法就是小批的梯度下降,这种方法把数据分为若干批,按批来更新参数。Keras中用的优化器是SGD

epochs 训练过程中,数据被轮了多少次

Dense 常用的全链接层

keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

参数:

  • units:大于0的整数,代表该层的输出维度。

  • activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)

  • use_bias: 布尔值,是否使用偏置项

  • kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers

  • bias_initializer:偏置向量初始化方法,为预定义初始化方法名的字符串,或用于初始化偏置向量的初始化器。参考initializers

  • kernel_regularizer:施加在权重上的正则项,为Regularizer对象

  • bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象

  • activity_regularizer:施加在输出上的正则项,为Regularizer对象

  • kernel_constraints:施加在权重上的约束项,为Constraints对象

  • bias_constraints:施加在偏置上的约束项,为Constraints对象

Activation 激活层

Dropout 随机断开一些神经元层

猜你喜欢

转载自blog.csdn.net/lihangxiaoji/article/details/80400851
今日推荐