使用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))

查看结果

在这里插入图片描述
从结果可以看到,经过10次交叉验证,准确率达到百分之97
然后把X放入模型进行验证
在这里插入图片描述在这里插入图片描述以输出结果的第一行为例
可以看到第一行数据预测分类结果的概率最大的为第一个百分之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))
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,让我们开始吧! 首先,我们需要导入需要的库和数据集。这里我们使用TensorFlow自带的鸢尾花数据集。 ```python import tensorflow as tf from tensorflow import keras from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 iris = load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42) ``` 接下来,我们需要对数据进行预处理。因为我们使用的是卷积神经网络,所以我们需要将数据转换为图像格式。同时,我们将标签转换为one-hot编码。 ```python # 将数据转换为图像格式 X_train = X_train.reshape(-1, 1, 4, 1) X_test = X_test.reshape(-1, 1, 4, 1) # 将标签转换为one-hot编码 y_train = keras.utils.to_categorical(y_train, 3) y_test = keras.utils.to_categorical(y_test, 3) ``` 接下来,我们可以开始构建ResNet模型。这里我们使用Keras的Sequential模型,并添加ResNet的各个层。 ```python model = keras.Sequential() # 第一层卷积 model.add(keras.layers.Conv2D(filters=64, kernel_size=(1, 4), strides=(1, 1), padding='valid', input_shape=(1, 4, 1))) model.add(keras.layers.BatchNormalization()) model.add(keras.layers.Activation('relu')) # 残差块 def residual_block(input_data, filters, strides=(1, 1)): x = keras.layers.Conv2D(filters=filters, kernel_size=(1, 4), strides=strides, padding='valid')(input_data) x = keras.layers.BatchNormalization()(x) x = keras.layers.Activation('relu')(x) x = keras.layers.Conv2D(filters=filters, kernel_size=(1, 4), strides=(1, 1), padding='valid')(x) x = keras.layers.BatchNormalization()(x) x = keras.layers.Add()([x, input_data]) x = keras.layers.Activation('relu')(x) return x # 堆叠残差块 def stack_residual_block(input_data, filters, blocks, strides=(1, 1)): x = residual_block(input_data, filters, strides) for i in range(1, blocks): x = residual_block(x, filters) return x # 残差网络 model.add(stack_residual_block(model.output, 64, blocks=2, strides=(1, 1))) model.add(stack_residual_block(model.output, 64, blocks=2, strides=(1, 1))) # 全局平均池化 model.add(keras.layers.GlobalAveragePooling2D()) # 全连接层 model.add(keras.layers.Dense(3, activation='softmax')) ``` 最后,我们可以编译模型并进行训练。 ```python # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(X_train, y_train, epochs=10, batch_size=16, validation_data=(X_test, y_test)) ``` 训练完成后,我们可以使用测试集对模型进行评估。 ```python # 评估模型 score = model.evaluate(X_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 这样,我们就使用TensorFlow(Keras)搭建了一个卷积神经网络ResNet,并使用鸢尾花数据集进行了分类任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值