在keras中训练模型的时候,准备比较有无GPU的模型训练时间花费具体有多大,所以采用了在fit前后调用time.time()的方式计算。代码为:
import time
start = time.clock()
history = model.fit(train_img, train_labels,
epochs=10, batch_size=128)
print(time.clock() - start)
注:在调用fit时发生的事情:网络开始在训练数据上进行迭代(每个小批量包含 128 个样本), 共迭代 10 次[在所有训练数据上迭代一次叫作一个轮次(epoch)]。 在每次迭代过程中,网络会计算批量损失相对于权重的梯度,并相应地更新权重。
在输出结果中发现:有无GPU的情况下相差不明显,但两者的运行日志明显差别巨大,准备一探究竟。
查找了以下原因,是因为fit采用的是异步执行的方式,如果想获取每一轮的fit时间,需要通过keras的回调函数 的方式进行获取。
如下所示,定义一个了 TimeHistory 回调函数,该回调函数记录了每一轮迭代所花费的时间,以及从训练开始到结束所花费的总时间:
import time
class TimeHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.times = []
self.totaltime = time.time()
def on_train_end(self, logs={}):
self.totaltime = time.time() - self.totaltime
def on_epoch_begin(self, batch, logs={}):
self.epoch_time_start = time.time()
def on_epoch_end(self, batch, logs={}):
self.times.append(time.time() - self.epoch_time_start)
TimeHistory回调函数的使用需要注意,callbacks参数虽然只有一个参数,然需要加[]
---- callbacks=[time_callback]
。
time_callback = TimeHistory()
history = model.fit(train_img, train_labels,
epochs=10, batch_size=128,
callbacks=[time_callback])
print(time_callback.times)
print(time_callback.totaltime)
获取到的输出结果和训练时的输出结果类似,fit内部的输出结果为:
Epoch 1/10
60000/60000 [==============================] - 23s 383us/step - loss: 0.0132 - acc: 0.9954
Epoch 2/10
60000/60000 [==============================] - 29s 492us/step - loss: 0.0098 - acc: 0.9968
Epoch 3/10
60000/60000 [==============================] - 25s 413us/step - loss: 0.0090 - acc: 0.9967
Epoch 4/10
60000/60000 [==============================] - 22s 367us/step - loss: 0.0085 - acc: 0.9971
Epoch 5/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0106 - acc: 0.9962
Epoch 6/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0080 - acc: 0.9975
Epoch 7/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0080 - acc: 0.9971
Epoch 8/10
60000/60000 [==============================] - 22s 367us/step - loss: 0.0061 - acc: 0.9981
Epoch 9/10
60000/60000 [==============================] - 22s 369us/step - loss: 0.0058 - acc: 0.9979
Epoch 10/10
60000/60000 [==============================] - 22s 368us/step - loss: 0.0078 - acc: 0.9974
回调函数所返回的结果如下:
22.996684074401855, 29.496134281158447, 24.777568817138672, 22.015268325805664, 22.113263845443726, 22.137538194656372, 22.160048961639404, 22.03213620185852, 22.14749526977539, 22.077812433242798
可以看出这里的结果和上面的Epoch中输出的结果类似,其实Epoch的结果就是回调函数结果的四舍五入。
【其他】
使用中,自己犯了一个低级错误,见 Keras fit函数中传入回调函数,提示『TypeError: set_model() missing 1 required positional argument: ‘model’』错误