Keras中进行模型训练时,计算每一步迭代所花费时间的方法

在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’』错误

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值