使用Keras创建一个鸢尾花分类识别神经网络

使用Keras创建一个鸢尾花分类识别神经网络

刚入门,小练习适应一下,哈哈哈

第一步

使用pandas导入数据,前四列是特征,最后一列是类别,将类别使用LabelEncoder进行训练转换,再将转换后的结果变为onehot(独热编码)

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)
y_onehot = np_utils.to_categorical(y_encoded)

第二步

搭建神经网络
使用Sequential线性结构连接
加入全连接层,设置节点数,输入数据维度,激活函数
指定损失函数,优化器,accuracy

def baselibe_model():
    model = Sequential()
    model.add(Dense(7, input_dim=4, activation='tanh'))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])
    #mean_square_error均方差,sgd优化器(随机梯度下降),accuracy以准确度衡量模型的好坏

    return model

第三步

交叉验证
指定epoch,用这个数据集训练网络200次
batch_size,每个批次放一个数据
verbose,训练时输出的信息
举个例子:
训练数据1000个样本,bathc_size=10,那么就是一次epoch,需要迭代100次,

estimator = KerasClassifier(build_fn=baselibe_model, epochs=200, batch_size=1, verbose=1)

第四步

评估
指定n_splits,把数据集分为10份,把其中9份作为训练数据,剩下一份作为测试数据,比较测试结果和真实的类别。进行10次训练和测试,也就是10编epoch
shuffle,每次分数据前打乱全部数据
指定种子
使用cross_val_score进行评估,输出结果的均值和方差

kfold = KFold(n_splits=10, shuffle=True, random_state=seed)
result = cross_val_score(estimator, x, y_onehot, cv=kfold)
print('Accury of cross validation, mean %.2f, std %.2f' % (result.mean(), result.std()))

第五步

模型的保存和读取
保存模型

#保存训练好的模型
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('Save model to disk')

读取模型

#读取模型
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))

查看结果

使用Keras创建一个鸢尾花分类识别神经网络_第1张图片
从结果可以看到,经过10次交叉验证,准确率达到百分之97
然后把X放入模型进行验证
使用Keras创建一个鸢尾花分类识别神经网络_第2张图片使用Keras创建一个鸢尾花分类识别神经网络_第3张图片以输出结果的第一行为例
可以看到第一行数据预测分类结果的概率最大的为第一个百分之84,也就是说第一个样本的预测结果为分类第第一种,由标签的预测结果也能看出。

最后放上完整代码

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, KFold
from sklearn.preprocessing import LabelEncoder
from keras.models import model_from_json

#设种子重现
seed = 13
np.random.seed(seed)

#导入数据
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)
y_onehot = np_utils.to_categorical(y_encoded)

#定义神经网络
def baselibe_model():
    model = Sequential()
    model.add(Dense(7, input_dim=4, activation='tanh'))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])
    #mean_square_error均方差,sgd优化器(随机梯度下降),accuracy以准确度衡量模型的好坏

    return model

#交叉验证
estimator = KerasClassifier(build_fn=baselibe_model, epochs=200, batch_size=1, verbose=1)

#评估
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)
result = cross_val_score(estimator, x, y_onehot, cv=kfold)
print('Accury of cross validation, mean %.2f, std %.2f' % (result.mean(), result.std()))

#保存训练好的模型
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('Save model to disk')

#读取模型
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))

你可能感兴趣的:(深度学习)