训练过程中将回调函数作用于模型:回调函数(callback)是在调用fit
时传入模型的一个对象(即实现特定方法的类实例),它在训练过程中的不同时间点都会被模型调用。它可以访问关于模型状态与性能的所有可用数据,还可以采取行动:中断训练、保存模型、加载一组不同的权重或改变模型的状态。
回调函数的一些用法示例如下所示:1、模型检查点:在训练过程中的不同时间点保存模型的当前权重。
2、提前终止:如果验证损失不再改善,则中断训练(当然,同时保存在训练过程中得到的最佳模型)。
3、在训练过程中动态调节某些参数值:比如优化器的学习率。
4、在训练过程中记录训练指标和验证指标,或将模型学到的表示可视化(这些表示也在不断更新):你熟悉的Keras 进度条就是一个回调函数!
首先引入相关包
#callback
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
print(tf.__version__)
print(sys.version_info)#系统的库
for module in mpl,np,pd,sklearn,tf,keras:
print(module.__name__,module.__version__)
导入数据
#导入数据
fashion_mnist = keras.datasets.fashion_mnist
#拆分,利用load_data函数
(x_train_all,y_train_all),(x_test,y_test) = fashion_mnist.load_data()
#再一次拆分为训练集和验证集
x_valid,x_train = x_train_all[:5000],x_train_all[5000:]
y_valid,y_train = y_train_all[:5000],y_train_all[5000:]
print(x_valid.shape,y_valid.shape)
print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)
归一化数据
#对数据进行归一化
#x = (x-u) / std
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
#x_train"[None , 28 ,28] ->[None,784]
x_train_scaled = scaler.fit_transform(
x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_valid_scaled = scaler.transform(
x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_test_scaled = scaler.transform(
x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
建立模型
#tf.keras.model.Sequential
#我的理解是:model是建立的一个Sequential模型
model = keras.models.Sequential()
#添加一些图层,这一句是指添加一个展平层,将输入一个28*28的一维向量
model.add(keras.layers.Flatten(input_shape=[28,28]))
#再加一层全连接层
#300个单元
model.add(keras.layers.Dense(400,activation="relu"))
model.add(keras.layers.Dense(200,activation="relu"))
model.add(keras.layers.Dense(10,activation="softmax"))
#另外一种写法
# model1 = keras.models.Sequential([
# keras.layers.Flatten(input_shape=[28,28]),
# keras.layers.Dense(300,activation='relu'),
# keras.layers.Dense(100,activation='relu'),
# keras.layers.Dense(10,activation='softmax')
# ])
#relu: y = max(0,x)
#softmax:将向量变成概率分布,x = [x1,x2,x3]
# y = [e^x1/sum,e^x2/sum,e^x3/sum],
# sum=e^x1/sum+e^x2/sum+e^x3/sum
#为什么用sparse:y只是一个index值,y经过one-hot变成向量
#if y是一个向量则loss='categorical_crossentropy'
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
三种回调函数
- Tensorboard(回调需要文件夹)
- earlystopping
- ModelCheckpoint(文件名)
#三种callback
#Tensorboard(文件夹),earlystopping,ModelCheckpoint(文件名)
logdir = './callbacks'
if not os.path.exists(logdir):
os.mkdir(logdir)#如果不存在
output_model_file = os.path.join(logdir,
'fashion_mnist_model.h5')
callbacks = [
keras.callbacks.TensorBoard(logdir),
keras.callbacks.ModelCheckpoint(output_model_file,
save_best_only = True),
#earlystopping参数
#mintor
#min_dalta
#patience
keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3)
]
fit,回调函数加上,等训练结束会生成一个callbacks文件夹…
history = model.fit(x_train_scaled,y_train,epochs=10,
validation_data=(x_valid_scaled,y_valid),
callbacks = callbacks)
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8,5))
plt.grid(True)
plt.gca().set_ylim(0,1)
plt.show()
plot_learning_curves(history)
TensorBoard
终端输入命令(第一次用这条命令结果打开网页出现错误,后来用下面的命令成功打开)
tensorboard --logdir=C:\Users\徐达\Desktop\code\google_tf2.0\callbacks