InvalidArgumentError: при запуске кода с графическим процессором в COLAB - PullRequest
0 голосов
/ 19 октября 2019

Я запускал систему распознавания текста из изображения в 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)
...