Набор данных TensorFlow: не удалось преобразовать массив NumPy в тензор (неподдерживаемый тип объекта numpy.ndarray)

#pandas #dataframe #numpy #tensorflow #tensorflow-datasets

#pandas #фрейм данных #numpy #tensorflow #tensorflow-datasets

Вопрос:

Я знаю, что подобные вопросы задавались неоднократно, но ни одно из предложенных решений, похоже, не работает для меня. У меня есть следующий фрейм данных Pandas :

Название Автор Цель Tag0 Tag1 Tag2 Tag3 Tag4 Tag5 Tag6 Tag7 Tag8 Tag9
0 Говорит, что Рон Джонсон назвал «The Lego Movie» «коварным заговором против бизнеса». 0 0 30 0 36 35 nan nan nan nan nan nan
1 «Сорок процентов из списка Fortune 500 были созданы иммигрантами или детьми иммигрантов». 1 0 9 21 5 28 nan nan nan nan nan nan

Я векторизовал Title атрибут с помощью TextVectorization layer при Keras получении следующего фрейма данных:

Название Автор Цель Tag0 Tag1 Tag2 Tag3 Tag4 Tag5 Tag6 Tag7 Tag8 Tag9
0 [9415, 19483, 9066, 16820, 20256, 6959, 6931,…,0 ] 0 0 3213 3829 223 3140 nan nan nan nan nan nan

Я хочу преобразовать этот Pandas фрейм данных в TensorFlow набор данных. Я попытался добиться этого, используя следующий код:

 dataset = tf.data.Dataset.from_tensor_slices((data.values, target.values))
 

Вот ошибка, которую я получаю:

 ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).
 

При удалении Title столбца ошибка исчезает, затем Title появляется столбец, который выдает ошибку. Title выглядит так:

 print(data["Title"].values)
 
 array([array([ 9415., 19483.,  9066., 16820., 20256.,  6959.,  6931.,  8539.,
       10705.,  1342.,  1896.,  4353., 14143.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.],
       ...,
       array([17497., 20189.,  4280.,  3460., 20256., 15754.,  9178.,  1114.,
       19441., 18731., 13875., 14018.,  5789.,  6959.,  8740., 13042.,
         929.,  9541.,   773., 19384.,  5659., 13042., 14578.,  2813.,
       17452.,   888.,  6206.,  6959., 14540.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
           0.,     0.,     0.,     0.,     0.,     0.,     0.],
      dtype=float32)], dtype=object)
 

Мой вопрос: что не так с Title ? Что я должен изменить?

Я предполагаю, что это связано с типом данных numpy.ndarray , содержащим каждый numpy.ndarray заголовок. Как это видно выше dtype=object . Но я не совсем уверен.

Заранее спасибо!

Редактировать:

Я нашел решение этой проблемы, просто преобразовав набор данных в Numpy ndarray.

 # To numpy
numpy_dataset = data.to_numpy(dtype="<U43")

#Get Target
target = data.pop("Target")

#TF dataset
dataset = tf.data.Dataset.from_tensor_slices((numpy_dataset, target.values))
 

Комментарии:

1. Каждая ячейка Title столбца представляет собой массив. values тогда это массив массивов. Попробуйте np.stack(data["Title"].values) . Если он выдает ошибку, эти вложенные массивы отличаются по форме и не могут быть преобразованы в 2d числовой массив (который tensorflow можно использовать).

2. Отлично, что решил мою проблему, но частично. Как вы можете видеть в приведенном выше коде, я передаю фрейм данных не только Titles . Если я сделаю то, что вы предложили, tf.data.Dataset.from_tensor_slices((np.stack(data["Title"].values), target.values)) TensorFlow набор данных будет создан. Но как я могу включить остальные столбцы?

Ответ №1:

Я нашел решение этой проблемы, просто преобразовав набор данных в Numpy ndarray.

 # To numpy
numpy_dataset = data.to_numpy(dtype="<U43")

#Get Target
target = data.pop("Target")

#TF dataset
dataset = tf.data.Dataset.from_tensor_slices((numpy_dataset, target.values))
 

Ответ №2:

Я сталкиваюсь с тем же вопросом, когда пробую демонстрацию tf feature_columns.ipynb. Я обнаружил, что данные содержат нулевые данные, после их удаления код сработал

     #drop null data
     dataframe = dataframe.dropna(axis=0, how='any')