Ben*_*ton 8 python keras tensorflow tensorflow2.0
我目前正在尝试获取TF2.0 API,但是当我将GradientTape与常规keras.Model.fit进行比较时,我注意到:
它运行速度较慢(可能是由于执行急切)
它收敛得慢得多(我不确定为什么)。
+--------+--------------+--------------+------------------+
| Epoch | GradientTape | GradientTape | keras.Model.fit |
| | | shuffling | |
+--------+--------------+--------------+------------------+
| 1 | 0.905 | 0.918 | 0.8793 |
+--------+--------------+--------------+------------------+
| 2 | 0.352 | 0.634 | 0.2226 |
+--------+--------------+--------------+------------------+
| 3 | 0.285 | 0.518 | 0.1192 |
+--------+--------------+--------------+------------------+
| 4 | 0.282 | 0.458 | 0.1029 |
+--------+--------------+--------------+------------------+
| 5 | 0.275 | 0.421 | 0.0940 |
+--------+--------------+--------------+------------------+
Run Code Online (Sandbox Code Playgroud)
这是我与GradientTape一起使用的训练循环:
+--------+--------------+--------------+------------------+
| Epoch | GradientTape | GradientTape | keras.Model.fit |
| | | shuffling | |
+--------+--------------+--------------+------------------+
| 1 | 0.905 | 0.918 | 0.8793 |
+--------+--------------+--------------+------------------+
| 2 | 0.352 | 0.634 | 0.2226 |
+--------+--------------+--------------+------------------+
| 3 | 0.285 | 0.518 | 0.1192 |
+--------+--------------+--------------+------------------+
| 4 | 0.282 | 0.458 | 0.1029 |
+--------+--------------+--------------+------------------+
| 5 | 0.275 | 0.421 | 0.0940 |
+--------+--------------+--------------+------------------+
Run Code Online (Sandbox Code Playgroud)
这是Keras.Model.fit培训:
optimizer = keras.optimizers.Adam()
glove_model = GloveModel(vocab_size=len(labels))
train_loss = keras.metrics.Mean(name='train_loss')
@tf.function
def train_step(examples, labels):
with tf.GradientTape() as tape:
predictions = glove_model(examples)
loss = glove_model.glove_loss(labels, predictions)
gradients = tape.gradient(loss, glove_model.trainable_variables)
optimizer.apply_gradients(zip(gradients, glove_model.trainable_variables))
train_loss(loss)
total_step = 0
for epoch in range(epochs_number):
pbar = tqdm(train_ds.enumerate(), total=int(len(index_data) / batch_size) + 1)
for ix, (examples, labels) in pbar:
train_step(examples, labels)
print(f"Epoch {epoch + 1}, Loss {train_loss.result()}")
# Reset the metrics for the next epoch
train_loss.reset_states()
Run Code Online (Sandbox Code Playgroud)
这是tf.data.Dataset源
glove_model.compile(optimizer, glove_model.glove_loss)
glove_model.fit(train_ds, epochs=epochs_number)
Run Code Online (Sandbox Code Playgroud)
这是模型。
train_ds = data.Dataset.from_tensor_slices(
(np.hstack([index_rows.reshape(-1, 1), index_cols.reshape(-1, 1)]), index_data)
).shuffle(100000).batch(batch_size, drop_remainder=True)
Run Code Online (Sandbox Code Playgroud)
我尝试了多种配置和优化器,但似乎没有任何改变。
问题来自使用tf.Dataset方法的改组。它当时只对数据集的一个桶进行洗牌。使用Keras.Model.fit产生了更好的结果,因为它可能会增加另一个改组。
我添加了洗牌numpy.random.shuffle,它提高了两种训练方法的性能:
现在数据集的生成是:
numpy_data = np.hstack([index_rows.reshape(-1, 1), index_cols.reshape(-1, 1), index_data.reshape(-1, 1)])
np.random.shuffle(numpy_data)
indexes = np.array(numpy_data[:, :2], dtype=np.uint32)
labels = np.array(numpy_data[:, 2].reshape(-1, 1), dtype=np.float32)
train_ds = data.Dataset.from_tensor_slices(
(indexes, labels)
).shuffle(100000).batch(batch_size, drop_remainder=True)
Run Code Online (Sandbox Code Playgroud)
结果是:
+--------+--------------+------------------+
| Epoch | GradientTape | keras.Model.fit |
+--------+--------------+------------------+
| 1 | 0.294 | 0.294 |
+--------+--------------+------------------+
| 2 | 0.111 | 0.110 |
+--------+--------------+------------------+
| 3 | 0.089 | 0.089 |
+--------+--------------+------------------+
| 4 | 0.074 | 0.075 |
+--------+--------------+------------------+
| 5 | 0.063 | 0.063 |
+--------+--------------+------------------+
Run Code Online (Sandbox Code Playgroud)
每个时期的训练类型大致相同,均为每个时期 2 分钟。
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |