深度学习 Keras Iris数据集神经网络训练

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##把训练好的模型存起来

seed = 13
np.random.seed(seed)

#load data
df=pd.read_csv("D:\DeepLearning\iris.csv")
X=df.values[:,0:4].astype(float)
Y=df.values[:,4]

##把三种花编码为数字
encoder=LabelEncoder()
Y_encoded=encoder.fit_transform(Y)
Y_onehot=np_utils.to_categorical(Y_encoded)

##定义一个神经网络,三层结构,四个维度输入,7个节点(隐藏层比较大,输入输出小,纺锤形),3个输出(三个类别)
def baseline_model():
    model=Sequential()
    model.add(Dense(7,input_dim=4,activation='tanh'))# 第一层,输入层到隐含层,有7个节点,输入数据纬度4维,双曲正切函数
    model.add(Dense(3, activation='softmax'))
    # 隐含层到输出层的结构,输出层与类别的个数一样,隐藏层的节点自己定
    model.compile(loss='mean_squared_error',optimizer='sgd',metrics=['accuracy'])
    ##编译模型:用均方差来衡量网络输出的差,训练优化网络-随机梯度下降法,metrics解释如何衡量模型的好坏
    return model

estimator=KerasClassifier(build_fn=baseline_model,epochs=20,batch_size=1,verbose=1)
##训练数据,用于交叉验证,epochs为训练次数20次,batch_size批次处理为1个训练数据,输入信息的浓缩程度verbose为1

#evalute评估
kfold=KFold(n_splits=10,shuffle=True,random_state=seed)
# kfold这个定义的交叉验证的方法
# 150个数据分为10份,挑9份训练数据,1份测试数据
# shuffle随机打乱
# 使得重复结果一致
result=cross_val_score(estimator,X,Y_onehot,cv=kfold)
# 调用estimator的训练结构对象,输入X,Y,然后验证
print("Accuracy of cross validation, mean %.2f, std %.2f" %(result.mean(),result.std()))
# 打印结果,均值,方差(训练十次)

# save model 将模型存起来
estimator.fit(X,Y_onehot) # 做训练数据
model_json = estimator.model.to_json() # 将其模型转换为json
# 保存成json形式输入、隐藏、输出层结构,激活函数
with open("./model.json","w")as json_file:
    json_file.write(model_json)
    # 权重不在json中,只保存网络结构

# 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(X) # 直接说明类别是什么
print("predicted label: " + str(predicted_label))

结果:

把训练数据分为十份,随机抽取一份为测试,所以会重复十次,每次做二十次交叉验证,随着epoch的增加,loss呈减少趋势,acc增加。135是因为有150个数据,分成十份,一份15个为测试数据,那么训练数据为135个

上面的概率为三个类别的概率大小,下面的数字为属于哪一个类别

发布了35 篇原创文章 · 获赞 4 · 访问量 2338

猜你喜欢

转载自blog.csdn.net/devilangel2/article/details/104272590