TensorFlow 学习(二) Keras 函数式编程实现鸢尾花分类

Keras 函数式编程

Keras 函数式编程定义复杂模型,可以参考 c++ 函数形式。

数据准备

导入包

机器学习工具都自带数据集,直接导入即可。

import tensorflow as tf
import numpy as np

导入数据集

from sklearn.datasets import load_iris #加载数据集
data = load_iris()

iris 数据集是 key - value 形式存在。key 值为:data 、 target 、target name 、DESCR、feature_names。

print("feature_name:",data.feature_names)
print("data:",data.data)
print("target_name:",data.target_names)
print("target:",data.target)
feature_name: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
data:  #这里显示前5组数据
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
target_name: ['setosa' 'versicolor' 'virginica']
target: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

获取 data 和 target。

iris_data = np.float32(data.data) #转为float类型的列表
iris_target = data.target

数据处理

one-hot 处理。

iris_target = np.float32(tf.keras.utils.to_categorical(iris_target,num_classes=3))#独热编码
iris_target = tf.data.Dataset.from_tensor_slices(iris_target).batch(50)#批量打印的形式
iris_data = tf.data.Dataset.from_tensor_slices(iris_data).batch(50)

构建模型

输入层

初始化一个keras张量,根据设定的维度大小(shape)生成一个张量空间。

inputs = tf.keras.layers.Input(shape=(4))

input 函数源码:

Input(shape=None,batch_size=None,name=None,dtype=None,sparse=False,tensor=None)
  • shape: 形状元组(整型),不包括batch size,表示一个batch占据的空间大小,可以认为样本集大小=batch个数*shape
  • batch_shape: 形状元组(整型),包括了batch size。for instance,
    batch_shape=(10,32)表示了预期的输入将是10个32维向量的批次。
  • name: 对于该层是可选的名字字符串。在一个模型中是独一无二的(同一个名字不能复用2次)。如果name没有被特指将会自动生成。
  • dtype: 预期的输入数据类型。
  • sparse: 特定的布尔值。
  • tensor: 可选的存在的向量包装到Input层,如果设置了,该层将不会创建一个占位张量。

中间层

x = tf.keras.layers.Dense(32,activation="relu")(inputs)#(inputs)为输入
x = tf.keras.layers.Dense(64,activation="relu")(x)

输出层

predictions = tf.keras.layers.Dense(3,activation="softmax")(x)

构建模型

model = tf.keras.Model(inputs = inputs,outputs = predictions)

inputs 为输入层( inputs) , outputs 为输出层( predictions)。Keras 将各个层通过输入输出连接起来。

损失函数和梯度更新

opt = tf.optimizers.Adam(1e-3)
for epoch in range(1000):
    for _data,lable in zip(iris_data,iris_target):
        with tf.GradientTape() as tape:
            logits = model(_data)
            loss_value = tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true= lable,y_pred= logits))#损失函数:先计算值,再计算损失函数
            grads = tape.gradient(loss_value,model.trainable_variables)
            opt.apply_gradients(zip(grads,model.trainable_variables))
print("Training loss is :",loss_value.numpy())

保存模型

数据的保存由 Keras 完成,将 Graph 和参数保存在 h5 文件中。

model.save('./saver/iris_model.h5') #若指定目录下没有saver文件夹,需要先再创建文件夹,keras 不会自动创建saver文件夹

h5 文件中保存的模型可以直接作为一个新的神经网络的模型使用

#载入模型
new_model = tf.keras.models.load_model('./saver/iris_modle.h5',compile=False)
#predict() 是Keras中的预测函数,加载h5文件中的模型后,可以直接使用预测函数。
new_prediction = new_model.predict(iris_data)

加载模型这里不添加 compile=False,会出现警告:

WARNING:tensorflow:No training configuration found in save file: the model was *not* compiled. Compile it manually.
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值