ValueError:无法在Keras/Tensorflow Python中将NumPy数组转换为Tensor(不支持的



我目前正在使用imdb-keras数据集进行二进制文本分类。几个小时以来,我一直在尝试解决这个问题,在stackoverflow和github中寻找答案,但这无济于事。这是我的代码

import tensorflow as tf
from tensorflow import keras
import numpy as np
data = keras.datasets.imdb
(x_train,y_train),(x_test,y_test) = data.load_data()
dictionary = data.get_word_index()
dictionary = {k:(v+3) for k,v in dictionary.items()}
dictionary['<PAD>'] = 0
dictionary['<START>'] = 1
dictionary['<UNKNOWN>'] = 2
dictionary['<UNUSED>'] = 3
dictionary = dict([(v,k) for (k,v) in dictionary.items()])
model = keras.Sequential([
keras.layers.Embedding(10000,16),
keras.layers.GlobalAveragePooling1D(),
keras.layers.Dense(16,activation='relu'),
keras.layers.Dense(1,activation='sigmoid')
])
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)
print(model.summary())
history = model.fit(x_train,y_train,epochs=50,batch_size=32,verbose=1)
prediction = model.predict(x_test)
print(prediction)

错误为:

Traceback (most recent call last):
File "imdb_classification.py", line 65, in <module>
history = model.fit(x_train,y_train,epochs=50,batch_size=32,verbose=1)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonkerasenginetraining.py", line 819, in fit
use_multiprocessing=use_multiprocessing)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonkerasenginetraining_v2.py", line 235, in fit
use_multiprocessing=use_multiprocessing)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonkerasenginetraining_v2.py", line 593, in _process_training_inputs
use_multiprocessing=use_multiprocessing)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonkerasenginetraining_v2.py", line 706, in _process_inputs
use_multiprocessing=use_multiprocessing)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonkerasenginedata_adapter.py", line 357, in __init__
dataset = self.slice_inputs(indices_dataset, inputs)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonkerasenginedata_adapter.py", line 383, in slice_inputs
dataset_ops.DatasetV2.from_tensors(inputs).repeat()
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythondataopsdataset_ops.py", line 566, in from_tensors
return TensorDataset(tensors)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythondataopsdataset_ops.py", line 2765, in __init__
element = structure.normalize_element(element)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythondatautilstructure.py", line 113, in normalize_element
ops.convert_to_tensor(t, name="component_%d" % i))
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonframeworkops.py", line 1314, in convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonframeworktensor_conversion_registry.py", line 52, in _default_conversion_function
return constant_op.constant(value, dtype, name=name)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonframeworkconstant_op.py", line 258, in constant
allow_broadcast=True)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonframeworkconstant_op.py", line 266, in _constant_impl
t = convert_to_eager_tensor(value, ctx, dtype)
File "C:UsersPHILIPAnaconda3libsite-packagestensorflow_corepythonframeworkconstant_op.py", line 96, in convert_to_eager_tensor
return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list)

请帮帮我。我真的很感激。感谢

您需要对序列进行矢量化。为了快速回答,我将维度缩小到10.000,你可以随心所欲地设置值。

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=10000)

我们将从vector_seq函数开始。

def vector_seq(sequences, dimension=10000):
results = zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results

vector_seq函数将x_trainx_test作为元组维度。你出现错误的原因是尺寸。您正在输入维度(25.000,(,但keras需要(25.000、10.000(。当然,您可以将10.000更改为您喜欢的任何值。

我们将继续格式化我们的数据

x_train = vector_seq(x_train)
x_test = vector_seq(x_test)
y_train = asarray(y_train).astype('float32')
y_test = asarray(y_test).astype('float32')

现在我们已经准备好编译我们的模型了。

以下是完整的代码:

from keras.datasets import imdb
from keras import Sequential, layers
from numpy import asarray, zeros

def vector_seq(sequences, dimension=10000):
results = zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=10000)
dictionary = imdb.get_word_index()
dictionary = {k: (v+3) for k, v in dictionary.items()}
dictionary['<PAD>'] = 0
dictionary['<START>'] = 1
dictionary['<UNKNOWN>'] = 2
dictionary['<UNUSED>'] = 3
dictionary = dict([(v, k) for (k, v) in dictionary.items()])
model = Sequential([
layers.Embedding(10000, 16),
layers.GlobalAveragePooling1D(),
layers.Dense(16, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)
print(model.summary())
x_train = vector_seq(x_train)
x_test = vector_seq(x_test)
y_train = asarray(y_train).astype('float32')
y_test = asarray(y_test).astype('float32')
history = model.fit(x_train, y_train, epochs=50, batch_size=32, verbose=1)
prediction = model.predict(x_test)
print(prediction)

最新更新