TF2.Optimizer
一、优化器
前几章,我们已经大概能把完整的一个模型搭建出来,并且也学会了编写评估指标。那么,我们就开始训练算法。
在训练算法的时候,你会发现不同的算法同学,训练的速度和准确率都不尽相同,甚至有很大的准确率差别。那么,除了前几章正常的选择激活函数,损失函数之外,我们还可以在数据层面,选用算法优化器,来提升算法收敛速度,提升准确率。
二、TF2 优化器
TF2中的优化器,最长使用的应该是SGD和Adam了,具体内容,参考如下:
实现方式均为:tf.keras.optimizers.XXX
三、TF2优化器使用
优化器的使用(三种优化方式):
- 1-使用apply_gradients,迭代变量
- 2-使用minimize,迭代变量
- 3-将优化器传入keras的Model中,通过model.fit来实现对loss的损失优化
2.0 预设输出日志
@tf.function
def printbar():
ts = tf.timestamp()
today_ts = ts % (24 * 60 * 60)
tf.print('today_ts', today_ts)
hour = tf.cast(today_ts // 3600 + 8, tf.int32) % tf.constant(24)
minite = tf.cast((today_ts % 3600) // 60, tf.int32)
second = tf.cast((today_ts % 60), tf.int32)
def timeformat(m):
if tf.strings.length(tf.strings.format('{}', m)) == 1:
return (tf.strings.format('0{}', m))
else:
return (tf.strings.format('{}', m))
timestring = tf.strings.join([timeformat(hour), timeformat(minite), timeformat(second)], separator=':')
tf.print('====' * 8, end='')
tf.print(timestring)
2.1 使用apply_gradients
# 求f(x) = a*x**2 + b*x + c
# 使用optimizer.apply_gradients
x = tf.Variable(0.0, name='x', dtype=tf.float32)
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
@tf.function
def minimizef():
a = tf.constant(1.0)
b = tf.constant(-2.0)
c = tf.constant(1.0)
while tf.constant(True):
with tf.GradientTape() as tape:
y = a * tf.pow(x, 2) + b * x + c
dy_dx = tape.gradient(y, x)
optimizer.apply_gradients(grads_and_vars=[(dy_dx, x)])
# 迭代终止条件
if tf.abs(dy_dx) < tf.constant(0.0001):
break
if tf.math.mod(optimizer.iterations, 100) == 0:
printbar()
tf.print('step = ', optimizer.iterations)
tf.print('x = ', x)
tf.print('')
y = a * tf.pow(x, 2) + b * x + c
return y
printbar()
tf.print('y = ', minimizef())
tf.print('x = ', x)
# >> y = 0
# >> x = 0.99995178
2.2 使用minimize
x = tf.Variable(0.0, name='x', dtype=tf.float32)
optimizer = tf.keras.optimizers.SGD(learning_rate=0.001)
def f():
a = tf.constant(1.0)
b = tf.constant(-2.0)
c = tf.constant(1.0)
y = a * tf.pow(x, 2) + b * x + c
return (y)
@tf.function
def train(epoch=10000):
for _ in tf.range(epoch):
optimizer.minimize(f, [x])
tf.print('epoch = ', optimizer.iterations)
return (f())
train(1000)
tf.print('y = ', f())
tf.print('x = ', x)
2.3 使用keras.Model.fit
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName :optimizer1.py
# @Time :2021/1/22 0022 19:59
# @Author :gaofei
# model.fit
import tensorflow as tf
import numpy as np
tf.keras.backend.clear_session()
class CalcModel(tf.keras.models.Model):
def __init__(self, a, b, c):
super(CalcModel, self).__init__()
self.a = a
self.b = b
self.c = c
def build(self):
self.x = tf.Variable(0.0, name='x')
self.built = True
def call(self, features):
loss = self.a * (self.x) ** 2 + self.b * (self.x) + self.c
return (tf.ones_like(features) * loss)
def myloss(y_true, y_pred):
return tf.reduce_mean(y_pred)
model = CalcModel(tf.constant(1.0), tf.constant(-2.0), tf.constant(1.0))
model.build()
model.summary()
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.001), loss=myloss)
history = model.fit(tf.zeros(100), tf.ones(100), batch_size=1, epochs=10)
tf.print('x = ', model.x)
tf.print('loss = ', model(tf.constant(0.0)))