十、【TF2】Optimizers 优化器

一、优化器

前几章,我们已经大概能把完整的一个模型搭建出来,并且也学会了编写评估指标。那么,我们就开始训练算法。
在训练算法的时候,你会发现不同的算法同学,训练的速度和准确率都不尽相同,甚至有很大的准确率差别。那么,除了前几章正常的选择激活函数,损失函数之外,我们还可以在数据层面,选用算法优化器,来提升算法收敛速度,提升准确率。

二、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)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值