利用keras搭建基础模型莺尾花

最近自学了一下,感觉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))
上一篇:10 个提高效率的 Linux 命令别名


下一篇:SAP Fiori Elements - how facet is loaded for my productive POC