如何将List转换为NumPy数组

4
这是到合作链接的网址:https://colab.research.google.com/drive/1wftAvDu_Wu2Y9ahgI1Z1FLciUH5MnSJ9 train_labels = ['政府方案', '政府方案', '政府方案', '政府方案', '农业保险']
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))

错误 => ValueError: 无法将NumPy数组转换为Tensor(不支持列表类型的对象)


1
输入和输出之间的逻辑是什么?如何重现 label_tokenizer.texts_to_sequences 的功能? - fireball.1
是的,这段代码有点不完整。label_tokenizer - 这是来自 TensorFlow 吗?如果是的话,它应该已经被包含在内了。就目前而言,这段代码只是一个片段,无法运行。发布一个最小可重现的示例非常重要。 - asylumax
使用 -- np.array([[x] for x in training_label_seq]) 后的输出结果: [list([3])] [list([3])] [list([3]])] - Anirudh_k07
@FrederikBode 通过将其上传到data.gov.in上使它可用! - Anirudh_k07
找不到它。你能提供一个下载链接吗? - Frederik Bode
显示剩余2条评论
1个回答

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.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'>

希望这回答了你的问题。学习愉快。

2020年2月6日更新 - Anirudh_k07,根据我们的讨论,我查看了你的程序,发现在使用np.hstack进行标签处理后,在model.fit()中出现以下错误。

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) 时,它们会创建额外的行。您可以使用 print(set(train_labels)) 打印唯一的 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()应该可以正常运行。
希望这回答了您的问题,祝学习愉快。

@Anirudh_k07 - 这个回答解决了你的问题吗? - user11530462
使用第二种方法 => 无法将NumPy数组转换为Tensor(不支持的对象类型numpy.ndarray)。 - Anirudh_k07
使用方法1,我的形状正在改变,尺寸不再匹配。 - Anirudh_k07
正如我们在答案中提到的,方法1是在model.fit()中使用的正确方式。方法2只是作为你在问题中所述的期望输出而提到的。输入形状是一个完全不同的问题,它取决于您的输入数据的形状和第一层中提到的输入形状。请分享这些信息,以便我们可以帮助您。 - user11530462
你在使用Tokenizer后进行pad_sequences以将输入序列填充到相同的长度吗?建议你查看此链接 - https://charon.me/posts/tf/tf3/ 以更好地了解模型拟合中的标记化和文本数据准备。 - user11530462
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接