1、引言
本练习使用内置API进行训练和验证时的训练,评估和预测(推断)模型(例如model.fit(),model.evaluate(),model.predict())。
我们最回顾下机器学习的一般步骤:
- 数据准备
- 创建模型
- 训练模型
- 评估模型
- 预测数据
其实任何机器学习的过程都是这几个大步骤的扩充和缩减。
说明:
- 本练习用tensorflow 2.1.0,python 3.7
- 如不说明,所有代码读引入以下包
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
- 不涉及分布式训练
2、第一个实例
下面的实例我们把数据传递给tensorflow 内置的训练方法和模型进行练习,其中原始数据通通常用Numpy arrarys(通常用于小数据或者想保存在内存的数据)或tf.data Dataset 对象(快速且大规模数据、需要分布式训练)或Pandas dataframes保存。这个实例我们用 MNIST dataset的数据保存在Numpy arrarys中。
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
#创建模型
inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense1")(inputs)
x = layers.Dense(64, activation="relu", name="dense2")(x)
outputs = layers.Dense(10, activation="softmax", name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
#下载数据
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 处理并且保存为 NumPy arrays
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255
y_train = y_train.astype("float32")
y_test = y_test.astype("float32")
# 保留部分数据作为验证数据
x_val = x_train[-10000:]
y_val = y_train[-10000:]
x_train = x_train[:-10000]
y_train = y_train[:-10000]
#编译模型
model.compile(
#指定优化器
optimizer=keras.optimizers.RMSprop(),
# 指定损失函数
loss=keras.losses.SparseCategoricalCrossentropy(),
# 配置训练指标类型
metrics=[keras.metrics.SparseCategoricalAccuracy()],
)
#训练模型
history = model.fit(
x_train,
y_train,
batch_size=64,
epochs=2,
#在每个训练周期结束后,传入验证数据评估下损失率和训练指标情况
validation_data=(x_val, y_val),
)
#模型训练后得到的模型的history属性保留了每一次训练的损失值和指标值
history.history
#用测试数据进行模型评估
results = model.evaluate(x_test, y_test, batch_size=128)
print("测试损失值, 测试正确值:", results)
#预测数据
predictions = model.predict(x_test[:3])
print("测试结果形状:", predictions.shape
实例解析:
- 调用模型的compile()方法时,指定损失函数,优化器以及可选的一些需要的监视度量。
#编译模型
model.compile(
#指定优化器
optimizer=keras.optimizers.RMSprop(),
# 指定损失函数
loss=keras.losses.SparseCategoricalCrossentropy(),
# 配置监控度量类型
metrics=[keras.metrics.SparseCategoricalAccuracy()],
)
针对多个输出的情况,可以指定多个损失函数和多个度量指标。
- 更加专业化的编码方式,应该把创建模型和编译模型函数化,方便代码的复用,如:
def get_uncompiled_model():
inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense1")(inputs)
x = layers.Dense(64, activation="relu", name="dense2")(x)
outputs = layers.Dense(10, activation="softmax", name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
return model
def get_compiled_model():
model = get_uncompiled_model()
model.compile(
optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["sparse_categorical_accuracy"],
)
return model
- 自动保留验证数据集
在实验中,我们通过validate_data参数将NumPy数组(x_val,y_val)的元组传递给模型,以便在每个时期结束时评估验证损失和验证指标。
#训练模型
history = model.fit(
x_train,
y_train,
batch_size=64,
epochs=2,
#在每个训练周期结束后,传入验证数据评估下损失率和训练指标情况
validation_data=(x_val, y_val),
)
实际应用内中可以通过validation_split参数指定保留百分之多少的数据作为验证数据,如下保留20%。
model = get_compiled_model()
model.fit(x_train, y_train, batch_size=64, validation_split=0.2, epochs=2)
3、内置的优化器、损失函数和度量
内置的优化器:
- SGD()
- RMSprop()
- Adam()
内置的损失函数:
- MeanSquaredError()
- KLDivergence()
- CosineSimilarity()
内置的度量:
- AUC()
- Precision()
- Recall()