当不想编写或调试Python训练循环时,该怎么办?

2021-09-21  本文已影响0人  LabVIEW_Python

当不想编写或调试Python训练循环时,Keras fit()方法可以节约大量的编码工作。因为Python编写的训练循环,很标准化,写过一遍后,反复写就很boring了。为了把时间花在真正有价值的地方,即定义模型上,需要掌握Keras fit方法。

下面给出一下范例,看看Keras fit方法可以节约多少编码工作:
使用Python编写训练循环,代码量:64行

import tensorflow as tf 
import matplotlib.pyplot as plt 

TRUE_W = 3.0
TRUE_B = 2.0
NUM_SAMPLES = 1000
# 生成数据标签对
x = tf.random.normal(shape=[NUM_SAMPLES], stddev=3)
noise = tf.random.normal(shape=[NUM_SAMPLES],stddev=1)
y = x * TRUE_W + TRUE_B + noise

#定义模型
class MyKerasModel(tf.keras.Model):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.w = tf.Variable(tf.random.normal(()))
        self.b = tf.Variable(0.0)
    def __call__(self, x, **kwargs):
        return self.w * x  + self.b

model = MyKerasModel()

#定义损失函数
def loss(target_y, pred_y):
    return tf.reduce_mean(tf.square(target_y - pred_y))

#绘制训练前的情况
plt.scatter(x, y, c='b')
plt.scatter(x, model(x), c='r')
plt.show()
print("Start Loss: %1.6f"%loss(y, model(x)).numpy())

#定义训练步骤
def train_step(model, x, y, lr):

    with tf.GradientTape() as tape:
        #计算损失
        current_loss = loss(y, model(x))

    #计算损失函数相对于模型参数的梯度
    dw, db = tape.gradient(current_loss, [model.w, model.b])

    #使用梯度更新模型参数
    model.w.assign_sub(lr*dw)
    model.b.assign_sub(lr*db)

ws, bs = [], []
epochs = range(30)

#定义训练循环 Training Loop
for epoch in epochs:
    train_step(model, x, y, lr=0.1)
    ws.append(model.w.numpy())
    bs.append(model.b.numpy())
    current_loss = loss(y, model(x))

    print(f"Epoch:{epoch}, w={ws[-1]},b={bs[-1]}, Loss:{current_loss}")

#绘制训练后的情况
plt.scatter(x, y, c='b')
plt.scatter(x, model(x), c='r')
plt.show()

model.save_weights("my_keras_model_ckpt")

使用Keras方式,代码量:37行

import tensorflow as tf 
import matplotlib.pyplot as plt 

TRUE_W = 3.0
TRUE_B = 2.0
NUM_SAMPLES = 1000
# 生成数据标签对
x = tf.random.normal(shape=[NUM_SAMPLES], stddev=3)
noise = tf.random.normal(shape=[NUM_SAMPLES],stddev=1)
y = x * TRUE_W + TRUE_B + noise

#定义模型
class MyKerasModel(tf.keras.Model):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.w = tf.Variable(tf.random.normal(()))
        self.b = tf.Variable(0.0)
    def __call__(self, x, **kwargs):
        return self.w * x + self.b 

model = MyKerasModel()

model.compile(optimizer="sgd", loss=tf.keras.losses.mean_squared_error)

#绘制训练前的情况
plt.scatter(x, y, c='b')
plt.scatter(x, model(x), c='r')
plt.show()

model.fit(x, y, epochs=30, batch_size=1000)

#绘制训练后的情况
plt.scatter(x, y, c='b')
plt.scatter(x, model(x), c='r')
plt.show()

model.save_weights("my_keras_model_ckpt")
上一篇下一篇

猜你喜欢

热点阅读