ValueError:无法在Keras/Tensorflow Python中将NumPy数组转换为张量(不支持的对象类型列表) [英] ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list) in Keras/Tensorflow Python

查看:114
本文介绍了ValueError:无法在Keras/Tensorflow Python中将NumPy数组转换为张量(不支持的对象类型列表)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i'm currently working for a binary text classification using imdb keras dataset. I have been try to fix this problem for a few hours, looking for answer in stackoverflow and github but that doesn't help. Here's my code

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:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 819, in fit
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 235, in fit
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 593, in _process_training_inputs
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 706, in _process_inputs
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py", line 357, in __init__
    dataset = self.slice_inputs(indices_dataset, inputs)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py", line 383, in slice_inputs
    dataset_ops.DatasetV2.from_tensors(inputs).repeat()
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\data\ops\dataset_ops.py", line 566, in from_tensors
    return TensorDataset(tensors)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\data\ops\dataset_ops.py", line 2765, in __init__
    element = structure.normalize_element(element)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\data\util\structure.py", line 113, in normalize_element
    ops.convert_to_tensor(t, name="component_%d" % i))
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1314, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\framework\tensor_conversion_registry.py", line 52, in _default_conversion_function
    return constant_op.constant(value, dtype, name=name)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 258, in constant
    allow_broadcast=True)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 266, in _constant_impl
    t = convert_to_eager_tensor(value, ctx, dtype)
  File "C:\Users\PHILIP\Anaconda3\lib\site-packages\tensorflow_core\python\framework\constant_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)

请帮助我.我真的很感激.谢谢

Please help me. I really appreciate. Thanks

推荐答案

您需要对序列进行矢量化处理.为了快速回答,我将尺寸减小到10.000,您可以根据需要设置值.

You need to vectorize the sequences. To answer quickly I reduced the dimension to 10.000, you can set the value whatever you like.

(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更改为任意值.

vector_seq function make x_train, x_test as a tuple dimension. The reason you got the error is because of the dimension. You are feeding the dimension (25.000,) but keras needs (25.000, 10.000). Of course, you can change the 10.000 to whatever you like.

我们将继续格式化数据

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

现在我们可以编译模型了.

and now we are ready to compile our model.

下面是完整的代码:

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)

这篇关于ValueError:无法在Keras/Tensorflow Python中将NumPy数组转换为张量(不支持的对象类型列表)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆