一.tensorflow常用模块
这些模块位于tf.keras中https://tensorflow.google.cn/api_docs/python/tf/keras
模块 | 概述 |
------------- | ------------------------------------------------------------ |
datasets | tf.keras数据集----mnist,fashion_mnist,imdb,boston_housing等 |
models | 模块创建API----Sequential。 |
layers | Keras层API----Flatten,Dense,Activation,Dropout等。 |
regularizers | 正则化-----L1,L2等。 |
optimizers | 优化方法----SGD,Adam等。 |
losses | 损失函数----MSE,CategoricalCrossentropy等。 |
metrics | 评价指标----Mean,Accuracy,等。 |
callbacks | 模型训练期间回调函数。EarlyStopping,Histtory等。 |
utils | 辅助功能----to_categorical等。 |
activations | 激活函数----relu,sigmoid,softmax,tanh等。 |
applications | 预训练网络----VGG19,RestNet152等。 |
preprocessing | 数据预处理。 |
二.数据导入
1.导入tf.keras
import tensorflow as tf
from tensorflow import keras
2.数据输入
一般用一下三种方式导入:
- numpy生成数据
- klearn.datasets获取数据集
- tf.data.datasets获取大数据集或要跨设备训练的数据
三.模型构建
1.通过Sequential搭建
model = keras.Sequential([
Dense(3,activation='relu',input_shape=(3,),kernel_initializer="he_normal",name='layer1'),
Dense(2,activation='relu',name='layer2'),
Dense(2,activation='sigmoid',name='layer3')
],name='my_Sequential')
# 或者使用 model.add()
model = keras.Sequential()
model.add(Dense(3,activation='relu',input_shape=(3,),kernel_initializer="he_normal",name='layer1'))
2.通过函数式API搭建
inputs = tf.keras.Input(shape=(3,),name='input') # 定义输入层
x = Dense(3,activation='relu',name='hidden1')(inputs) # 隐藏层1
x = Dense(2,activation='relu',name='hidden2')(x) # 隐藏层2
y = Dense(2,activation='sigmoid',name='output')(x) # 输出层
model = keras.Model(inputs=inputs,outputs=y,name='my_model')
# 如果有多个输入输出时,要写成如下形式
model = keras.Model(inputs=[input1,input2],outputs=[output,aut_output1,aut_output2])
# 注意:inputs一定要是Input()类,不能二次封装,outputs的每一项必须是models生成的对象,不能二次封装
3.通过Model子类搭建
class MyModel(tf.keras.Model):
# 定义网络的层结构
def __init__(self):
super().__init__()
self.layer1 = Dense(3,activation='relu',input_shape=(3,),name='inputs')
self.layer2 = Dense(2,activation='relu',name='hidden')
self.layer3 = Dense(2,activation='sigmoid',name='output')
# 定义网络的向前传播
def call(self, inputs):
x = self.layer1(inputs)
x = self.layer2(x)
return self.layer3(x)
model = MyModel()
x = tf.ones((2,3))
y = model3(x)
四.训练与评估
1.配置训练过程
主要配置:优化器,损失函数,评估指标 这三部分
model.compile(
optimizer=tf.keras.optimizers.SGD(0.05), # 'sgd'/'tanh'/'adam'
loss=keras.losses.*, # 'mse'/'categorical_crossentropy'
metrics=['accuracy'],
loss_weights=[1,0.3,0.3] # 模型中多个输出的loss的权重
)
2.模型训练
(1).fit训练时将数据全部加载到内存中,适合小数据集
history = model.fit(
x=None, # 输入数据
y=None, # 标签数据
batch_size=None, # 每次训练的数据量
epochs=1, # 训练的周期
callbacks=None, # 传入训练时使用的回调函数。例如[early_stopping]
validation_split=0., # 0-1,将训练集的一部分用来验证
validation_data=None, # 验证集(x_test,y_test),存在validation_split时无效
shuffle=True,
steps_per_epoch=None # 每个周期内迭代的次数 = 样本数/batch_size
)
(2).fit_generator可以使用生成器出入数据,不需要一次加载全部数据,适合大数据集
model.fit_generator(
generator, # 生成器keras.utils.Sequence对象的实例,
# (x_data,y_data)或(x_data,y_data,weights)的元组
steps_per_epoch=None, # 每个epoch周期内训练的次数
epochs=1,
verbose=1,
callbacks=None,
validation_data=None,
validation_steps=None,
max_queue_size=10, # 生成器能生成数据的最大次数
workers=1, # 表示使用的最大进程数
use_multiprocessing=False,# 若为True,则使用基于进程的多线程
)
(3).train_on_batch(x,y) # 自定义训练
for i in range(10001): # 训练2002次 batch:批处理
loss = model.train_on_batch(x_data,y_data)
if i%500 == 0:
print('loss--',loss)
回调函数:回调函数用来控制模型训练行为,可以使用tf.keras.callbacks,也可以自定义:
- EarlyStopping 当验证集上的性能不在提升时,提前终止训练。
- TensorBoard 使用TensorBoard检测模型的状态,可视化网页界面
- LearningRateScheduler 动态改变学习率
- ModelCheckpoint 定期保存checkpoints
3.查看训练结果
history = model.fit(x_train,y_train,epochs=4,......)
history.history----->{'loss':[],'accuracy':[]}
plt.figure()
plt.plot(history.history['loss'],label="loss")
plt.plot(history.history["accuracy"],label="accuracy")
plt.legend()
plt.grid()
plt.show()
模型训练结果输出的内容,与 评估指标的个数m + 模型输出个数n有关
-
当模型有m个评价标准时:
-
模型只有1个输出时,结果输出为
[loss,mertic_1,mertic_2,mertic_3,...,mertic_m] # 1 个损失值 + m 个指标值
-
模型有n个输出时,结果输出为 :
[loss,loss_1,...,loss_n, # n+1 个损失值 n1_mertic_1,n1_mertic_2,...,n1_mertic_m, # m*n 个指标值 n2_mertic_1,n2_mertic_2,...,n2_mertic_m, ...... nn_mertic_1,nn_mertic_2,...,nn_mertic_m]
-
-
当模型没有评价标准时:
- 模型只有1个输出时,结果输出为1个 loss 值
- 模型有n个输出时,结果输出为
[loss,loss_1,...,loss_n] # n+1 个损失值
4.模型评估
model.evaluate(x,y,batch_size=32)
5.模型预测
model.predict(x, batch_size=32)
model.predict_classes(test) # 预测的是类别,打印出来的值就是类别号
五.模型保存与加载
1.只保存参数
model.save_weights('my_model.h5') # 从h5文件加载权重模型
model.load_weights('my_model.h5') # 以h5格式保存模型文件的权重
2.保存整个模型
model.save('my_model.h5')
model = keras.models.load_model('my_model.h5')
3.保存整个SavedModel模型(与编程语言无关)
model.save('my_model')
model = keras.models.load_model('my_model')
4.ModelCheckpoint自动保存模型
from tensorflow.keras.callbacks import ModelCheckpoint,CSVLogger
mc = ModelCheckpoint(
filepath = 'xxx/epoch_valaccury.h5',
monitor = 'val_accuracy', # 'val_accuracy','val_loss','loss','accuracy'
versobe=1,
save_best_only=True # 表示只保存 > best_val_accuracy的模型
)
csvl = CSVLogger('log.csv')
model.fit(callbacks=[mc,csvl])
六.模型常用的公共属性和方法
model.layers # 返回组成模型的所有层列表
model.get_layer() # 根据名字或索引查找返回一个层的实例
model.inputs() # 返回模型的输入列表
model.outputs() # 返回模型的输出列表
model.get_config() # 返回模型配置的字典
model.get_weights() # 返回模型权重列表
model.set_weights(weights) # 设置模型权重
model.to_json() # 返回json字符串表示的模型结构
model.model_from_json(json_str) # 恢复模型结构
model.summary() # 模型结构