#python #tensorflow #nlp #jupyter-notebook #tail-recursion
#python #тензорный поток #nlp #jupyter-ноутбук #хвостовая рекурсия
Вопрос:
Обновить
Мне удалось решить проблему, создав список, содержащий как функции (обзоры), так и метки (общий рейтинг), затем использовал mapping / apply (при использовании фреймов данных panda), чтобы преобразовать их в тензоры. На этом этапе я использовал метод from_tensor_slices из tensorflow, чтобы подготовить функции / метки для обучения.
Исходная проблема
В настоящее время я работаю над проектом NLP, чтобы помочь изучить Python / Tensorflow. Моя программа принимает обзоры, кодирует их, преобразует в тензоры и тензорные наборы данных, затем передает их в нейронную сеть. Проблема, с которой я сталкиваюсь, — это «ошибка рекурсии: превышена максимальная глубина рекурсии при вызове объекта Python», которая связана с объединением тензоров в один набор тензорных данных.
Когда я пытаюсь получить доступ к элементу из набора данных (либо через объект iter, либо через обучение сети), появляется ошибка рекурсии.
Что я сделал:
Если я уменьшу общее количество обзоров, которые я обрабатываю, с исходных 9000 до 1500, все будет работать нормально.
Если я использую
import sys
sys.setrecursionlimit(10000)
затем ядро juypter умирает вместо того, чтобы выдавать мне ошибку рекурсии.
Соответствующий код (я думаю)
#encode the text
encoded_reviews=[]
for j in trimmed_review:
encoded_reviews.append(encoder.encode(j))
#creating tensorflow datasets for training
def labeler(review, rating):
return review, rating
#pairing the labels (good/bad game) with the encoded reviews
encoded_review_rating_list=[]
for i,j in enumerate(encoded_reviews):
encoded_review_dataset = tf.data.Dataset.from_tensors(tf.cast(j, dtype='int64'))
encoded_review_rating_list.append(encoded_review_dataset.map(lambda x: labeler(x,ratings[i])))
#Combine the list of review:score sets into a single tensor dataset.
encoded_review_ratings = encoded_review_rating_list[0]
#test_var_tensor=tf.constant()
for single_dataset in encoded_review_rating_list[1:]:
encoded_review_ratings=encoded_review_ratings.concatenate(single_dataset)
#Shuffle the datasets to avoid any biases.
buffer_size = len(encoded_reviews)
all_labeled_data = encoded_review_ratings.shuffle(
buffer_size, reshuffle_each_iteration=False)
##Split the encoded words into training and test datasets, take size amount of data that goes into the training set
training_ratio=0.6
take_size= round(len(encoded_reviews)*training_ratio)
batch_size=30
#Organizing our training and validation data, the padded shapes are set to the longest review (as specified by None keywords)
train_data = all_labeled_data.take(take_size)
train_data = train_data.padded_batch(batch_size, padded_shapes=((None,), (1,)))
test_data = all_labeled_data.skip(take_size)
test_data = test_data.padded_batch(batch_size, padded_shapes=((None,), (1,)))
Код ошибки при доступе к тензору в наборе данных
next_feature, next_label = next(iter(test_data))
print (next_feature, next_label)
```---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
<ipython-input-8-e941c005ed79> in <module>
----> 1 next_feature, next_label = next(iter(test_data))
2
3 print (next_feature, next_label)
~anaconda3envstf-gpulibsite-packagestensorflow_corepythondataopsdataset_ops.py in __iter__(self)
416 if (context.executing_eagerly()
417 or ops.get_default_graph()._building_function): # pylint: disable=protected-access
--> 418 return iterator_ops.OwnedIterator(self)
419 else:
420 raise RuntimeError("__iter__() is only supported inside of tf.function "
~anaconda3envstf-gpulibsite-packagestensorflow_corepythondataopsiterator_ops.py in __init__(self, dataset, components, element_spec)
592 context.context().device_spec.device_type != "CPU"):
593 with ops.device("/cpu:0"):
--> 594 self._create_iterator(dataset)
595 else:
596 self._create_iterator(dataset)
~anaconda3envstf-gpulibsite-packagestensorflow_corepythondataopsiterator_ops.py in _create_iterator(self, dataset)
598 def _create_iterator(self, dataset):
599 # pylint: disable=protected-access
--> 600 dataset = dataset._apply_options()
601
602 # Store dataset reference to ensure that dataset is alive when this iterator
~anaconda3envstf-gpulibsite-packagestensorflow_corepythondataopsdataset_ops.py in _apply_options(self)
356
357 dataset = self
--> 358 options = self.options()
359 if options.experimental_threading is not None:
360 t_options = options.experimental_threading
~anaconda3envstf-gpulibsite-packagestensorflow_corepythondataopsdataset_ops.py in options(self)
347 options = Options()
348 for input_dataset in self._inputs():
--> 349 input_options = input_dataset.options()
350 if input_options is not None:
351 options = options.merge(input_options)
... last 1 frames repeated, from the frame below ...
~anaconda3envstf-gpulibsite-packagestensorflow_corepythondataopsdataset_ops.py in options(self)
347 options = Options()
348 for input_dataset in self._inputs():
--> 349 input_options = input_dataset.options()
350 if input_options is not None:
351 options = options.merge(input_options)
RecursionError: maximum recursion depth exceeded while calling a Python object
Ответ №1:
Предоставление решения в разделе ответов в интересах сообщества. Спасибо @Accommodator за обновление.
Мне удалось решить проблему, создав список, содержащий как функции (обзоры), так и метки (общий рейтинг), затем использовал mapping / apply (при использовании фреймов данных panda), чтобы преобразовать их в тензоры. На этом этапе я использовал метод from_tensor_slices из tensorflow, чтобы подготовить функции / метки для обучения