Как преобразовать список в массив numpy - PullRequest
4 голосов
/ 30 мая 2020

Вот ссылка на сотрудничество https://colab.research.google.com/drive/1wftAvDu_Wu2Y9ahgI1Z1FLciUH5MnSJ9

train_labels = ['GovernmentSchemes', 'GovernmentSchemes', 'GovernmentSchemes', 'GovernmentSchemes', 'CropInsurance']

training_label_seq = np.array(label_tokenizer.texts_to_sequences(train_labels))

прибывает вывод:

[list([3]) list([3]) list([3]) ... list([2]) list([5]) list([1])]

ожидаемый вывод:

[[3] [3] [3] .. [2] [5]...]
num_epochs = 30
history = model.fit(train_padded, training_label_seq, epochs=num_epochs, validation_data=(validation_padded, validation_label_seq))

Error => ValueError: не удалось преобразовать массив NumPy в тензор (не поддерживается список типов объектов)

1 Ответ

0 голосов
/ 01 июня 2020

Мне удалось воссоздать вашу проблему, используя приведенный ниже код -

Код для воссоздания проблемы -

import numpy as np
import tensorflow as tf
print(tf.__version__)
from tensorflow.keras.preprocessing.text import Tokenizer

label_tokenizer = Tokenizer()

# Fit on a text 
fit_text = "Tensorflow warriors are awesome people"
label_tokenizer.fit_on_texts(fit_text)

# Training Labels
train_labels = "Tensorflow warriors are great people"
training_label_list = np.array(label_tokenizer.texts_to_sequences(train_labels))

# Print the 
print(training_label_list)
print(type(training_label_list))
print(type(training_label_list[0]))

Вывод -

2.2.0
[list([9]) list([1]) list([10]) list([5]) list([3]) list([2]) list([11])
 list([7]) list([3]) list([6]) list([]) list([6]) list([4]) list([2])
 list([2]) list([12]) list([3]) list([2]) list([5]) list([]) list([4])
 list([2]) list([1]) list([]) list([4]) list([2]) list([1]) list([])
 list([]) list([2]) list([1]) list([4]) list([9]) list([]) list([8])
 list([1]) list([3]) list([8]) list([7]) list([1])]
<class 'numpy.ndarray'>
<class 'list'>

Решение -

  1. Замена np.array на np.hstack решит вашу проблему. Теперь ваш model.fit() должен работать нормально.
  2. Иначе, если вы ищете ожидаемый результат, как в вашем вопросе, training_label_list = label_tokenizer.texts_to_sequences(train_labels) предоставит вам список списка. Вы можете использовать np.array([np.array(i) for i in training_label_list]) для преобразования в массив массива. Это работает только в том случае, если ваш список списков содержит списки с одинаковым количеством элементов.

Код np.hstack - Код для точки номер 1 в решении.

import numpy as np
import tensorflow as tf
print(tf.__version__)
from tensorflow.keras.preprocessing.text import Tokenizer

label_tokenizer = Tokenizer()

# Fit on a text 
fit_text = "Tensorflow warriors are awesome people"
label_tokenizer.fit_on_texts(fit_text)

# Training Labels
train_labels = "Tensorflow warriors are great people"
training_label_list = np.hstack(label_tokenizer.texts_to_sequences(train_labels))

# Print the 
print(training_label_list)
print(type(training_label_list))
print(type(training_label_list[0]))

Вывод -

2.2.0
[ 9.  1. 10.  4.  2.  3. 11.  7.  2.  5.  5.  6.  3.  3. 12.  2.  3.  4.
  6.  3.  1.  3.  1.  6.  9.  8.  1.  2.  8.  7.  1.]
<class 'numpy.ndarray'>
<class 'numpy.float64'>

Ожидаемый вывод, как в вопросе - Код для точки № 2 в решении.

import numpy as np
import tensorflow as tf
print(tf.__version__)
from tensorflow.keras.preprocessing.text import Tokenizer

label_tokenizer = Tokenizer()

# Fit on a text 
fit_text = "Tensorflow warriors are awesome people"
label_tokenizer.fit_on_texts(fit_text)

# Training Labels
train_labels = "Tensorflow warriors are great people"
training_label_list = label_tokenizer.texts_to_sequences(train_labels)

# Print 
print(training_label_list)
print(type(training_label_list))
print(type(training_label_list[0]))

# To convert elements to array
training_label_list = np.array([np.array(i) for i in training_label_list])

# Print
print(training_label_list)
print(type(training_label_list))
print(type(training_label_list[0]))

Вывод -

2.2.0
[[9], [1], [10], [4], [2], [3], [11], [7], [2], [5], [], [5], [6], [3], [3], [12], [2], [3], [4], [], [6], [3], [1], [], [], [3], [1], [6], [9], [], [8], [1], [2], [8], [7], [1]]
<class 'list'>
<class 'list'>
[array([9]) array([1]) array([10]) array([4]) array([2]) array([3])
 array([11]) array([7]) array([2]) array([5]) array([], dtype=float64)
 array([5]) array([6]) array([3]) array([3]) array([12]) array([2])
 array([3]) array([4]) array([], dtype=float64) array([6]) array([3])
 array([1]) array([], dtype=float64) array([], dtype=float64) array([3])
 array([1]) array([6]) array([9]) array([], dtype=float64) array([8])
 array([1]) array([2]) array([8]) array([7]) array([1])]
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>

Надеюсь, это ответит на ваш вопрос. Удачного обучения.


Обновление 2/6/2020 - Anirudh_k07 , Согласно нашему обсуждению, я изучил вашу программу, и вы попадаете ниже ошибка в model.fit() после использования np.hstack для меток.

ValueError: Data cardinality is ambiguous:
  x sizes: 41063
  y sizes: 41429
Please provide data which shares the same first dimension.

Эта ошибка возникает из-за того, что некоторые метки содержат специальные символы, такие как - и /. Таким образом, при выполнении np.hstack(label_tokenizer.texts_to_sequences(train_labels) они создают дополнительные строки. Вы можете распечатать список уникальных train_labels, используя print(set(train_labels)).

Вот суть того, что я пытаюсь сказать -

# These Labels have special character
train_labels = ['Bio-PesticidesandBio-Fertilizers','Old/SenileOrchardRejuvenation']
training_label_seq = np.hstack(label_tokenizer.texts_to_sequences(train_labels))
print("Two labels are converted to Five :",training_label_seq)

# These Labels are fine
train_labels = ['SoilHealthCard', 'PostHarvestPreservation', 'FertilizerUseandAvailability']
training_label_seq = np.hstack(label_tokenizer.texts_to_sequences(train_labels))
print("Three labels are remain three :",training_label_seq)

Вывод -

Two labels are converted to Five : [17 18 19 51 52]
Three labels are remain three : [20 36  5]

Так что любезно проведите надлежащую предварительную обработку и удалите эти специальные символы из train_labels, а затем используйте np.hstack(label_tokenizer.texts_to_sequences(train_labels)) на этикетках. После этого ваш model.fit() должен работать нормально.

Надеюсь, это ответит на ваш вопрос. Удачного обучения.

...