鸢尾花识别更正

#3.1 模块与数据的导入
#步骤 1 引入本次实验需求的模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import tensorflow as tf
import os
#步骤 2 导入数据,载入鸢尾花数据集,本数据集共有 150 个带标签的数据
iris = load_iris()
#步骤 3 将数据集分为训练集 135 条,测试集 15 条
iris_train, iris_test, target_train, target_test = train_test_split(iris.data, iris.target, test_size=0.1)


#3.2 制作容易被 tensorflow 数据迭代器
#步骤 1 制作训练数据与测试数据的 python 迭代器
def generate_train():
    for i, j in zip(iris_train, target_train):
        yield (i, j)
def generate_test():
    for i, j in zip(iris_test, target_test):
        yield (i, j)
#步骤 2 转化为 tensorflow 可识别的模式

def iter_data(generator):
    # 转化成tf.data 格式
    data = tf.data.Dataset.from_generator(generator=generator,
                        output_types=(tf.float32,tf.int32),
                        output_shapes=(tf.TensorShape([4]),
                        tf.TensorShape([])))
    # 将数据流转化成一批一批的,设定batch_size,每组十条数据
    data= data.batch(batch_size=5)
    # 创建数据集的迭代器 每次返回一个张量数据
    return data
# 分别生成tensorflow 可识别的训练集,测试集的迭代器
iter_train = iter_data(generate_train)
iter_test = iter_data(generate_test)

#3.3 构建神经网络,损失函数和优化器
#步骤 1 构建 3 层 DNN 模型,外加一层 dropout 层
model = tf.keras.Sequential([
    # 第一层网络必须要有input_shape
    tf.keras.layers.Dense(10, activation=tf.nn.relu, input_shape=(4,)),
    # 输入 10,输出 10
    tf.keras.layers.Dense(10, activation=tf.nn.relu),
    # 增加 dropout 正则层
    tf.keras.layers.Dropout(0.5),
    # 输入 10,输出 3,对应 3 分类
    tf.keras.layers.Dense(3)])
#步骤 2 定义模型的损失值
def loss(model, x,y):
    y_= model(x)
    # 返回交叉熵损失
    return tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=y_)
#步骤 3 计算模型的梯度值
def grad(model, inputs, targets):
    with tf.GradientTape() as tape:
        loss_value = loss(model, inputs, targets)
    return loss_value, tape.gradient(loss_value, model.trainable_variables)


#步骤 4 构建优化器,本实验使用了 SGD 作为优化器
# optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
# optimizer = tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
#optimizer = tf.keras.optimizers.SGD(lr=0.01, momentum=0.01, decay=0.01, nesterov=False)
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)

#3.4 构建训练函数并训练
#步骤 1 构建训练模型
def train_model(training_dataset, model, optimizer):
    # 将所有数据集训练 200 次
    for epoch in range(1, 201):
        epoch_loss_avg = tf.metrics.Mean()
        epoch_accuracy = tf.metrics.Accuracy()
        # 每次训练将一批(batch)的数据传入优化器,
        # 在本次训练中共有 135 条数据,每批 5 条,所以传 27 轮
        for feature, label in training_dataset:
            # 计算模型的损失与对应的梯度
            loss, gradients = grad(model, feature, label)
            # 讲梯度传入优化器进行反向训练
            # 参数:grads_and_vars 梯度与所有变量的组合
            # 参数:global_step,变量更新后用于增加的变量
            optimizer.apply_gradients(grads_and_vars=zip(gradients,
                                                model.variables))
            # 计算本批次数据损失的均值
            epoch_loss_avg(loss)
            # 返回最有可能的分类
            epoch_maxprob_output = tf.argmax(model(feature),
                            axis=1, output_type=tf.int32)
            # 计算本批次预测的准确性
            epoch_accuracy(epoch_maxprob_output, label)
            # 每 50 轮完整训练打印一次数据
        if epoch % 10 == 0:
            print("Epoch {:03d}: Loss: {:.3f}, Accuracy: {:.3%}".format(epoch,
                                                                epoch_loss_avg.result(),
                                                                epoch_accuracy.result()))
        print('model training finished')
#步骤 2 训练模型
train_model(iter_train, model,optimizer)


#3.5 构建测试函数并测试
#步骤 1 构建测试函数
def test_model(test_dataset, model):
    for test_feature, test_label in test_dataset:
        Prediction = tf.argmax(model(test_feature), axis=1, output_type=tf.int32)
        Acc = tf.metrics.Accuracy()
        Acc(Prediction, test_label)
        print("Prediction, labels, accuracy: {},{},{:.3%}".
            format(Prediction, test_label, Acc.result()))
#步骤 2 使用测试集评估
test_model(iter_test, model)


#3.6 保存模型
#步骤 1 保存模型
# 创建模型保存文件夹
if not os.path.exists('./model/'):
    os.mkdir('./model/')
# 训练完之后保存模型
model.save(filepath='./model/DNN.HDF5')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑曜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值