TensorfFlow2【3】常用模块,模型的创建编译训练

一.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()					# 模型结构	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值