最近自学了一下,感觉keras貌似挺好用的,这里记录一下学习过程,并且给出源代码。
详细思路我都有写出注释。
练手之作,诸多不足,欢迎讨论。
第一步:建立模型
Keras有两种类型的模型,序列模型和函数式模型。
这里我使用的是序列模型,采用的方式为.add()的方法,一层一层构建。
#define a network
def baseline_model():
model = Sequential() #是顺序的
model.add(Dense(7, input_dim=4 , activation='tanh')) #输入层有7个节点,
model.add(Dense(3, activation='softmax')) #输出层
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy']) #均方误差 优化器 判别
return model
这里需要注意的是,模型需要知道数据的输入shape,只有第一层需要指定shape参数,后面的层数是可以自动推导。
在训练之前,对学习过程进行配置的函数为compile(),其中三个参数分别为:优化器optimizer,损失函数loss, 判别函数metrics。
第二步:训练
这里注意,我使用了kfold
estimator = KerasClassifier(build_fn=baseline_model, epochs = 20, batch_size= 1, verbose=1)
- batch_size:整数,指定进行梯度下降时每个batch包含的样本数。
- epochs:整数,训练终止时的epochs数
- verbose:日志显示,0为不输出,1为输出进度条记录,2为每个epoch输出一条记录
第三步:保存模型和输出相关的性能参数
这一步描述的具体的训练结束–>保存模型---->调用模型---->输出key值,一套完整的流程。
简单来说,作为一个基础的keras算法框架就出来了。
后续我也会在上面进行各种拓展。
细节请看全部代码
全部代码:
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from keras.models import Sequential #序列 串行
from keras.layers import Dense #
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score #引入交叉验证
from sklearn.model_selection import KFold #测试集和验证集
from sklearn.preprocessing import LabelEncoder #把文本转化为数值
from keras.models import model_from_json #把模型存为json,需要的时候再读出来,直接预测。
from keras.optimizers import SGD
# reproducibility 重现
seed = 13
np.random.seed(seed) #打乱顺序,降低拟合
#load data 导入数据
df = pd.read_csv('iris.csv') #文件在哪呢
X = df.values[:,0:4].astype(float)
Y = df.values[:,4]
encoder = LabelEncoder()
Y_encoded = encoder.fit_transform(Y) #将3个字母转化为 0 0 1 之类的。
Y_onehot = np_utils.to_categorical(Y_encoded) #这两个要联合起来使用,使用的效果是把字符转化为数字,然后把数字转化为矩阵,
'''
##
具体效果,关于LabEncoder 和to_categorical
from keras.utils.np_utils import *
#类别向量定义
b = [0,1,2,3,4,5,6,7,8]
#调用to_categorical将b按照9个类别来进行转换
b = to_categorical(b, 9)
print(b)
执行结果如下:
[[1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1.]]
'''
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
#define a network
def baseline_model():
model = Sequential() #是顺序的
model.add(Dense(7, input_dim=4 , activation='tanh')) #输入层有7个节点,
model.add(Dense(3, activation='softmax')) #输出层
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy']) #均方误差 优化器 判别
return model
estimator = KerasClassifier(build_fn=baseline_model, epochs = 20, batch_size= 1, verbose=1)
#evalute
kfold = KFold(n_splits=10,shuffle=True,random_state=seed) #随机发生器的种子
result = cross_val_score(estimator, X,Y_onehot,cv=kfold)
print('Accuray of cross validation, mean %.2f, std %.2f'% (result.mean(),result.std()))
#save model
estimator.fit(X, Y_onehot)
model_json = estimator.model.to_json()
with open('model.json','w') as json_file:
json_file.write(model_json)
estimator.model.save_weights('model.h5')
print('saved model to disk')
#load model and use it for prediction
json_file = open('model.json','r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json) #知道网络结构,
loaded_model.load_weights('model.h5') #知道每一层的参数和具体结构
print('loaded model from disk')
predicted = loaded_model.predict(X)
print('predicted probability:'+ str(predicted))
predicted_label = loaded_model.predict_classes()
print('predicted label:'+ str(predicted_label))