当前位置: 首页 > 知识库问答 >
问题:

tensorflow的Numpy数组。克拉斯。预处理。文本标记器。文本序列给出了奇怪的输出,列表([2]),而不是[[2]]

林泰平
2023-03-14

tensorflow的Numpy数组。克拉斯。预处理。文本标记器。文本\u到\u序列为培训标签提供奇怪的输出,如下所示:

(training_label_list[0:10]) = [list([1]) list([1]) list([1]) list([1]) list([1]) list([1]) list([1]) list([1]) list([1]) list([1])]

但是正在为验证标签打印普通数组,

(validation_label_list[0:10]) = [[16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]]

换句话说,type(training_label_list[0])=

type(validation_label_list[0]) =  <class 'numpy.ndarray'>

因此,在使用Keras模型训练模型时。拟合,它会导致以下错误,

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

这是谷歌可乐的链接,很容易重现错误。

下面给出了重现错误的完整代码:

!pip install tensorflow==2.1

# For Preprocessing the Text => To Tokenize the Text
from tensorflow.keras.preprocessing.text import Tokenizer
# If the Two Articles are of different length, pad_sequences will make the length equal
from tensorflow.keras.preprocessing.sequence import pad_sequences

# Package for performing Numerical Operations
import numpy as np

Unique_Labels_List = ['India', 'USA', 'Australia', 'Germany', 'Bhutan', 'Nepal', 'New Zealand', 'Israel', 'Canada', 'France', 'Ireland', 'Poland', 'Egypt', 'Greece', 'China', 'Spain', 'Mexico']


Train_Labels = Unique_Labels_List[0:14]
#print('Train Labels = {}'.format(Train_Labels))

Val_Labels =  Unique_Labels_List[14:]
#print('Val_Labels = {}'.format(Val_Labels))

No_Of_Train_Items = [248, 200, 200, 218, 248, 248, 249, 247, 220, 200, 200, 211, 224, 209]
No_Val_Items = [212, 200, 219]

T_L = []
for Each_Label, Item in zip(Train_Labels, No_Of_Train_Items):
    T_L.append([Each_Label] * Item)

T_L = [item for sublist in T_L for item in sublist]

V_L = []
for Each_Label, Item in zip(Val_Labels, No_Val_Items):
    V_L.append([Each_Label] * Item)

V_L = [item for sublist in V_L for item in sublist]


len(T_L)

len(V_L)

label_tokenizer = Tokenizer()

label_tokenizer.fit_on_texts(Unique_Labels_List)

# Since it should be a Numpy Array, we should Convert the Sequences to Numpy Array, for both Training and 
# Test Labels

training_label_list = np.array(label_tokenizer.texts_to_sequences(T_L))

validation_label_list = np.array(label_tokenizer.texts_to_sequences(V_L))

print('(training_label_list[0:10]) = {}'.format((training_label_list[0:10])))
print('(validation_label_list[0:10]) = {}'.format((validation_label_list[0:10])))

print('type(training_label_list[0]) = ', type(training_label_seq[0]))
print('type(validation_label_seq[0]) = ', type(validation_label_seq[0]))

如果有人能建议我如何获得相同格式的培训标签和验证标签,我将不胜感激,因为我在这方面花了太多时间。


共有2个答案

上官鸿祯
2023-03-14

您的问题是,当您将训练数据转换为numpy数组时,特定的numpy数组由列表元素组成,因此会出现错误

ValueError:无法将NumPy数组转换为张量(不支持的对象类型列表)。

这个错误比它看起来更微妙;一些人报告说他们不得不从2.1.0切换回2.0.0。Numpy的数组()和阿斯数组()函数之间有什么区别?

我个人会试试这个:

  1. 使用training_label_list=np.asarray(label_tokenizer.texts_to_sequences(T_L)),而不是np.array。Tensorflow-ValueError:无法将NumPy数组转换为Tensor(不支持的对象类型浮点)
  2. 根据这个:

将列表列表放入numpy数组

你将不得不强制施展(虽然很奇怪,但这应该是可行的):

x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>

在试图帮助你解决这个问题时,我发现了一个关于Numpy铸造的有趣事实:

案例1:

   my_list = [[1,2],[2],[3]]
   my_numpy_array = np.array(my_list)
   print(type(my_numpy_array))
   print(type(my_numpy_array[0]))
   <class 'numpy.ndarray'>
   <class 'list'>

案例2:

    my_list = [[1],[2],[3]]
    my_numpy_array = np.array(my_list)
    print(type(my_numpy_array))
    print(type(my_numpy_array[0]))
    <class 'numpy.ndarray'>
    <class 'numpy.ndarray'>

简短的结论:如果子列表的长度不同,显然它们被保留为列表,而不是转换为Numpy数组。

我对你的代码进行了测试,现在它可以工作了:

training_label_seq = np.asarray(label_tokenizer.texts_to_sequences(T_L))

training_label_seq = np.array([np.array(training_element) for training_element in training_label_seq])

validation_label_seq = np.asarray(label_tokenizer.texts_to_sequences(V_L))



print('(training_label_seq[0:10]) = {}'.format((training_label_seq[0:10])))
print('(validation_label_seq[0:10]) = {}'.format((validation_label_seq[0:10])))

print('type(training_label_list[0]) = ', type(training_label_seq[0]))
print('type(validation_label_seq[0]) = ', type(validation_label_seq[0]))



(training_label_seq[0:10]) = [array([1]) array([1]) array([1]) array([1]) array([1]) array([1])
 array([1]) array([1]) array([1]) array([1])]
(validation_label_seq[0:10]) = [[16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]
 [16]]
type(training_label_list[0]) =  <class 'numpy.ndarray'>
type(validation_label_seq[0]) =  <class 'numpy.ndarray'>
胡劲
2023-03-14

替换np。数组带有np。正如Stack中提到的那样,Stack解决了这个问题。

现在,正确的输出是

(training_label_seq[0:10]) = [1 1 1 1 1 1 1 1 1 1]
(validation_label_seq[0:10]) = [16 16 16 16 16 16 16 16 16 16]
type(training_label_list[0]) =  <class 'numpy.int64'>
type(validation_label_seq[0]) =  <class 'numpy.int64'>

工作代码的链接在这个Google Colab中。

下面提到的是工作代码(以防上述链接不起作用):

!pip install tensorflow==2.1

# For Preprocessing the Text => To Tokenize the Text
from tensorflow.keras.preprocessing.text import Tokenizer
# If the Two Articles are of different length, pad_sequences will make the length equal
from tensorflow.keras.preprocessing.sequence import pad_sequences

# Package for performing Numerical Operations
import numpy as np

Unique_Labels_List = ['India', 'USA', 'Australia', 'Germany', 'Bhutan', 'Nepal', 'New Zealand', 'Israel', 'Canada', 'France', 'Ireland', 'Poland', 'Egypt', 'Greece', 'China', 'Spain', 'Mexico']


Train_Labels = Unique_Labels_List[0:14]
#print('Train Labels = {}'.format(Train_Labels))

Val_Labels =  Unique_Labels_List[14:]
#print('Val_Labels = {}'.format(Val_Labels))

No_Of_Train_Items = [248, 200, 200, 218, 248, 248, 249, 247, 220, 200, 200, 211, 224, 209]
No_Val_Items = [212, 200, 219]

T_L = []
for Each_Label, Item in zip(Train_Labels, No_Of_Train_Items):
    T_L.append([Each_Label] * Item)

T_L = [item for sublist in T_L for item in sublist]

V_L = []
for Each_Label, Item in zip(Val_Labels, No_Val_Items):
    V_L.append([Each_Label] * Item)

V_L = [item for sublist in V_L for item in sublist]


len(T_L)

len(V_L)

label_tokenizer = Tokenizer()

label_tokenizer.fit_on_texts(Unique_Labels_List)

# Since it should be a Numpy Array, we should Convert the Sequences to Numpy Array, for both Training and 
# Test Labels

training_label_list = np.hstack(label_tokenizer.texts_to_sequences(T_L))

validation_label_list = np.hstack(label_tokenizer.texts_to_sequences(V_L))

print('(training_label_list[0:10]) = {}'.format((training_label_list[0:10])))
print('(validation_label_list[0:10]) = {}'.format((validation_label_list[0:10])))

print('type(training_label_list[0]) = ', type(training_label_seq[0]))
print('type(validation_label_seq[0]) = ', type(validation_label_seq[0]))

 类似资料:
  • 我使用以下模型对来自多种语言的句子进行标记化:https://tfhub.dev/google/universal-sentence-encoder-cmlm/multilingual-preprocess/2 其中,对于以下输入: 输出以下令牌: 从这个输出中,我想恢复标记的文本表示。类似于: 到目前为止,我一直在寻找代币 你知道怎么做吗? 先谢谢你的帮助,

  • (关于如何强制C#FtpWebRequest使用直接IP而不是通过HTTP代理进入互联网?) 使用C#从FTP服务器获取目录列表。输出被格式化为超文本标记语言。必需是一个未格式化的列表(由Linuxls命令返回)。(试图避免解析超文本标记语言以获取文件列表。) 意见: > FTP服务器是由客户端运行的vsftpd。 在例如Filezilla FTP服务器上列出目录时,不会出现此问题。 获取目录列表

  • 问题内容: 我有一些这样的文字: 我想显示不带标签的内容: 我也不想应用标签,我想剥离它们。有什么简单的方法可以做到这一点? 角HTML: 问题答案: jQuery比SLOWER慢40倍左右 ,请不要将jQuery用于该简单任务。 用法: 使用angular.js: 用 :

  • 问题内容: 从两个列表中选择列表的最快,最优雅的方法是什么? 我有 我想要 我当时在考虑使用map而不是zip,但我不知道是否有一些标准库方法作为第一个参数。 我可以为此定义自己的功能,并使用map,我的问题是是否已经实现了某些功能。 否 也是答案。 问题答案: 如果您要压缩2个以上的列表(就此而言,甚至压缩2个),一种可读的方式将是: 这使用列表推导并将列表(元组)中的每个元素转换为列表。

  • 我已经用下面的CQL创建了一个表:我想运行查询,按演员姓名(不区分大小写)查找所有视频。 我想从表中选择所有行,而不管演员的名字大小写,例如“汤姆·汉克斯”、“汤姆·汉克斯”、“汤姆·汉克斯”等。 有可能吗?

  • 问题内容: 我有一些面板内的组合框: 在我将项目更新到.NET 4之前还可以,在将项目(和AJAX)更新到.net4之后,这看起来真的很奇怪……我无法解释正确,我将显示: 我该如何解决?:)完整的CSS / ASPX页面在这里-> https://github.com/nCdy/Issues/tree/master/Ajax%20ComboBox(字符串#287) 问题答案: 我有一个类似的问题,