我正在尝试this HTR model,但我认为培训时间太长。该代码最初是为CPU编写的,但我在GPU上执行,并将数据集存储在RAM中以显着提高性能。但是,sess.run()需要50个图像批处理,仍然需要约0.18秒。此外,训练时GPU会显示约30%的负载,并且预处理时间可以忽略不计(约0.008秒)。
我应该指出,批处理大小为25和100的图像可获得大致相同的性能,批处理大小为250的sess.run()大约需要0.25秒。
所以我的问题是这些:
我尝试设置管道,但未成功。
在模型中:__init __(带有main.py中的enqueue_op = loader.getNext)
self.q = tf.FIFOQueue(capacity=5, dtypes=[tf.float32, tf.int64, tf.int32, tf.int64, tf.int32]) # enqueue 5 batches
self.enq_op = enqueue_op
self.enqueue_op = self.q.enqueue(self.create_dict)
self.numberOfThreads = 2
self.qr = tf.train.QueueRunner(self.q, [self.enqueue_op] * self.numberOfThreads)
tf.train.add_queue_runner(self.qr)
self.inputImgs_tmp, self.indices_gTP_tmp, self.values_gTP_tmp, self.shape_gTP_tmp, self.sqLen_tmp = self.q.dequeue()
在模型中:startCoordinator,stopCoordinator,createDict
def startCoordinator(self):
self.coord = tf.train.Coordinator()
self.threads = tf.train.start_queue_runners(sess=self.sess, coord=self.coord)
def stopCoordinator(self):
self.coord.request_stop()
self.coord.join(self.threads)
def create_dict(self):
batch = self.enq_op()
numBatchElements = len(batch.imgs)
sparse = self.toSparse(batch.gtTexts)
return batch.imgs, sparse[0], sparse[1], sparse[2], [Model.maxTextLen] * numBatchElements
在main.py中,训练(模型,装载程序)
while True:
epoch += 1
print('Epoch:', epoch)
model.startCoordinator()
# train
print('Train NN')
batches_startTime = time.time()
loader.trainSet()
while loader.hasNext():
batch_startTime = time.time()
iterInfo = loader.getIteratorInfo()
batch_trainStartTime = time.time()
loss = model.trainBatch()
print('Batch:', iterInfo[0],'/', iterInfo[1], 'Loss: %.3f' % loss, '\t batch dur: %.3f' % (time.time() - batch_startTime), ' preprocess dur: %.3f' % (batch_trainStartTime - batch_startTime), ' train dur: %.3f' % (time.time() - batch_trainStartTime))
model.stopCoordinator()