当不想编写或调试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")