Я запускал систему распознавания текста из изображения в COLAB , используя GPU . Работает нормально без GPU . Но с использованием графического процессора он заканчивается InvalidArgumentError . Моя модель выглядит следующим образом.
class Model:
# Model Constants
batchSize = 10
imgSize = (800, 64)
maxTextLen = 100
def __init__(self, charList, decoderType=DecoderType.BestPath, mustRestore=False):
self.charList = charList
self.decoderType = decoderType
self.mustRestore = mustRestore
self.snapID = 0
tf.keras.backend.clear_session()
with(tf.device('/gpu:0')):
# CNN
with tf.name_scope('CNN'):
with tf.name_scope('Input'):
self.inputImgs = tf.placeholder(tf.float32, shape=(
Model.batchSize, Model.imgSize[0], Model.imgSize[1]))
cnnOut4d = self.setupCNN(self.inputImgs)
# RNN
with tf.name_scope('RNN'):
rnnOut3d = self.setupRNN(cnnOut4d)
# # Debuging CTC
# self.rnnOutput = tf.transpose(rnnOut3d, [1, 0, 2])
# CTC
with tf.name_scope('CTC'):
(self.loss, self.decoder) = self.setupCTC(rnnOut3d)
self.training_loss_summary = tf.summary.scalar(
'loss', self.loss) # Tensorboard: Track loss
# Optimize NN parameters
with tf.name_scope('Optimizer'):
self.batchesTrained = 0
self.learningRate = tf.placeholder(tf.float32, shape=[])
self.optimizer = tf.train.RMSPropOptimizer(
self.learningRate).minimize(self.loss)
# Initialize TensorFlow
(self.sess, self.saver) = self.setupTF()
self.writer = tf.summary.FileWriter(
'./logs', self.sess.graph) # Tensorboard: Create writer
self.merge = tf.summary.merge(
[self.training_loss_summary]) # Tensorboard: Merge
Но во время работы выдает ошибку типа
InvalidArgumentError: Невозможно назначить устройство для операции CTC / CTC_Loss / CTCLoss: не удалось удовлетворить явную спецификацию устройства '/ device: GPU: 0 'потому что нет поддерживаемого ядра для устройств с графическим процессором. Информация об отладке Colocation: у группы Colocation были следующие типы и поддерживаемые устройства: Корневой член (assign_device_name_index _ = - 1 требуемое_устройство_имя _ = '/ устройство: GPU: 0' assign_device_name_ = '' resource_device_name_ = '' enabled_device_types _ = [CPU] возможных_devices _ = [] CTCCPU
члены Colocation, запрошенные пользователем устройства и устройства, назначенные платформой, если таковые имеются: CTC / CTC_Loss / CTCLoss (CTCLoss) / device: GPU: 0
Op: CTCLoss Узел attrs: ignore_longer_outputs_than_inputs= true, preprocess_collapse_repeated = false, ctc_merge_repeated = true, T = DT_FLOAT Зарегистрированные ядра: устройство = 'CPU'; T в [DT_DOUBLE]
устройство = 'CPU'; T в [DT_FLOAT]
[[{{node CTC / CTC_Loss / CTCLoss}}]]
Во время обработки вышеупомянутого исключения произошло другое исключение:
InvalidArgumentError Traceback (последний вызов был последним) / usr / local / lib /python3.6 / dist-packages / tenororflow_core / python / client / session.py в _do_call (self, fn, * args) 1382
'\ nsession_config.graph_option.rewrite_options. '1383
' disable_meta_optimizer = True ') -> 1384 тип повышения (e) (node_def, op, message) 1385 1386 def _extend_graph (self):
InvalidArgumentError: Невозможно назначить устройстводля операции CTC / CTC_Loss / CTCLoss: не удалось удовлетворить явную спецификацию устройства '/ device: GPU: 0', поскольку недоступно поддерживаемое ядро для устройств GPU. Информация об отладке Colocation: у группы Colocation были следующие типы и поддерживаемые устройства: Корневой член (assign_device_name_index _ = - 1 требуемое_устройство_имя _ = '/ устройство: GPU: 0' assign_device_name_ = '' resource_device_name_ = '' enabled_device_types _ = [CPU] возможных_devices _ = [] CTCCPU
члены Colocation, запрошенные пользователем устройства и устройства, назначенные платформой, если они есть: CTC / CTC_Loss / CTCLoss (CTCLoss) / device: GPU: 0
Моя настройка CTCвыглядит следующим образом
def setupCTC(self, ctcIn3d):
""" Create CTC loss and decoder and return them """
# BxTxC -> TxBxC
ctcIn3dTBC = tf.transpose(ctcIn3d, [1, 0, 2])
# Ground truth text as sparse tensor
with tf.name_scope('CTC_Loss'):
self.gtTexts = tf.SparseTensor(tf.placeholder(tf.int64, shape=[
None, 2]), tf.placeholder(tf.int32, [None]), tf.placeholder(tf.int64, [2]))
# Calculate loss for batch
self.seqLen = tf.placeholder(tf.int32, [None])
loss = tf.nn.ctc_loss(labels=self.gtTexts, inputs=ctcIn3dTBC, sequence_length=self.seqLen,
ctc_merge_repeated=True, ignore_longer_outputs_than_inputs=True)
with tf.name_scope('CTC_Decoder'):
# Decoder: Best path decoding or Word beam search decoding
if self.decoderType == DecoderType.BestPath:
decoder = tf.nn.ctc_greedy_decoder(
inputs=ctcIn3dTBC, sequence_length=self.seqLen)
elif self.decoderType == DecoderType.WordBeamSearch:
# Import compiled word beam search operation (see https://github.com/githubharald/CTCWordBeamSearch)
word_beam_search_module = tf.load_op_library(
'./TFWordBeamSearch.so')
# Prepare: dictionary, characters in dataset, characters forming words
chars = codecs.open(FilePaths.fnCharList, 'r', 'utf8').read()
wordChars = codecs.open(
FilePaths.fnWordCharList, 'r', 'utf8').read()
corpus = codecs.open(FilePaths.fnCorpus, 'r', 'utf8').read()
# # Decoder using the "NGramsForecastAndSample": restrict number of (possible) next words to at most 20 words: O(W) mode of word beam search
# decoder = word_beam_search_module.word_beam_search(tf.nn.softmax(ctcIn3dTBC, dim=2), 25, 'NGramsForecastAndSample', 0.0, corpus.encode('utf8'), chars.encode('utf8'), wordChars.encode('utf8'))
# Decoder using the "Words": only use dictionary, no scoring: O(1) mode of word beam search
decoder = word_beam_search_module.word_beam_search(tf.nn.softmax(
ctcIn3dTBC, dim=2), 25, 'Words', 0.0, corpus.encode('utf8'), chars.encode('utf8'), wordChars.encode('utf8'))
# Return a CTC operation to compute the loss and CTC operation to decode the RNN output
return (tf.reduce_mean(loss), decoder)