TF2.0深度学习实战(二):用compile()和fit()快速搭建MINIST分类器

前言

创建网络后,正常的流程是:
(1)通过循环迭代数据集多遍,每次按批产生训练数据,前向计算;
(2)然后通过损失函数计算误差值;
(3)反向传播自动计算梯度,更新网络参数。
这一部分逻辑由于非常通用,可以直接通过 Keras 提供的模型装配训练高层接口实现。在 keras 中提供了 compile()和 fit()函数方便实现上述功能,简洁清晰。

1.模型装配接口model.compile()

创建完网络network后,即可通过compile()指定网络使用的优化器对象,损失函数,评价指标等:

# 模型装配
network.compile(optimizer=optimizers.Adam(lr=0.01),  # 指定Adam优化器,学习率为0.01
              loss=tf.losses.CategoricalCrossentropy(from_logits=True),  # 指定采用交叉熵损失函数,包含Softmax
              metrics=['accuracy'])  # 指定评价指标为准备率

2.模型训练接口model.fit()

模型装配完成后,即可通过 fit()函数送入待训练的数据和验证用的数据集:

# 模型训练
# 输入训练集train_dataset,训练20个epochs; 每训练完2个epochs,对验证集val_dataset验证一次
network.fit(train_dataset, epochs=20, validation_data=val_dataset, validation_freq=2)
network.evaluate(val_dataset)  # 打印输出验证后的结果(loss和accuracy)

3.使用compile和fit搭建MINIST分类器

import tensorflow as tf
from tensorflow.keras import layers, optimizers, datasets, Sequential, metrics  # 导入TF子库

# 1.数据集准备
(x, y), (x_val, y_val) = datasets.mnist.load_data()  # 加载数据集,返回的是两个元组,分别表示训练集和测试集
# (1)训练集
x = tf.convert_to_tensor(x, dtype=tf.float32)/255.  # 转换为张量,并缩放到0~1
y = tf.convert_to_tensor(y, dtype=tf.int32)  # 转换为张量(标签)
y = tf.one_hot(y, depth=10)  # 热独编码
train_dataset = tf.data.Dataset.from_tensor_slices((x, y))  # 构建数据集对象
train_dataset = train_dataset.shuffle(60000).batch(128)  # 打乱顺序,设置批量训练的batch为128
# (2)验证集
x_val = tf.convert_to_tensor(x_val, dtype=tf.float32)/255.
y_val = tf.convert_to_tensor(y_val, dtype=tf.int32)
y_val = tf.one_hot(y_val, depth=10)
val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
val_dataset = val_dataset.batch(128)

# 2.网络搭建
network = Sequential([
    layers.Reshape(target_shape=(28 * 28,), input_shape=(28, 28)),
    layers.Dense(512, activation=tf.nn.relu),
    layers.Dense(256, activation=tf.nn.relu),
    layers.Dense(128, activation=tf.nn.relu),
    layers.Dense(64, activation=tf.nn.relu),
    layers.Dense(32, activation=tf.nn.relu),
    layers.Dense(10)
])
network.build(input_shape=[None, 28*28])
network.summary()

# 3.模型装配
network.compile(optimizer=optimizers.Adam(lr=0.01),  # 指定优化器
                loss=tf.losses.CategoricalCrossentropy(from_logits=True),  # 指定采用交叉熵损失函数,包含Softmax
                metrics=['accuracy'])  # 指定评价指标为准备率

# 4.模型训练
history = network.fit(train_dataset, epochs=20, validation_data=val_dataset, validation_freq=2)
network.evaluate(val_dataset)  # 打印输出loss和accuracy

4.测试效果

在这里插入图片描述
训练集有60000个数据,程序中设置的batch=128
图中的469指的是每一个epochs中的step数,是可以通过计算得到的:60000/128=469
这个是在测试过程中的一部分结果,此时训练集上的准确度达到0.9780,验证集上的准确度达到了0.9716。

发布了51 篇原创文章 · 获赞 135 · 访问量 5064

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/104996161
今日推荐