Tensorflow-ValueError: 未能将 NumPy 数组转换为 Tensor (不支持对象类型 float)

继续上一个问题: Tensorflow-TypeError: int & # 39; object is not iterable

我的培训数据是一个列表,每个列表由1000个浮点组成

[0.0, 0.0, 0.1, 0.25, 0.5, ...]

这是我的模型:

model = Sequential()


model.add(LSTM(128, activation='relu',
input_shape=(1000, 1), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))


opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)


model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])


model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))

我得到的错误是这样的:

Traceback (most recent call last):
File "C:\Users\bencu\Desktop\ProjectFiles\Code\Program.py", line 88, in FitModel
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 728, in fit
use_multiprocessing=use_multiprocessing)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 224, in fit
distribution_strategy=strategy)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 547, in _process_training_inputs
use_multiprocessing=use_multiprocessing)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 606, in _process_inputs
use_multiprocessing=use_multiprocessing)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py", line 479, in __init__
batch_size=batch_size, shuffle=shuffle, **kwargs)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py", line 321, in __init__
dataset_ops.DatasetV2.from_tensors(inputs).repeat()
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\data\ops\dataset_ops.py", line 414, in from_tensors
return TensorDataset(tensors)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\data\ops\dataset_ops.py", line 2335, in __init__
element = structure.normalize_element(element)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\data\util\structure.py", line 111, in normalize_element
ops.convert_to_tensor(t, name="component_%d" % i))
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1184, in convert_to_tensor
return convert_to_tensor_v2(value, dtype, preferred_dtype, name)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1242, in convert_to_tensor_v2
as_ref=False)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1296, in internal_convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\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\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 227, in constant
allow_broadcast=True)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 235, in _constant_impl
t = convert_to_eager_tensor(value, ctx, dtype)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\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 float).

我自己也试过在谷歌上搜索这个错误,我发现了一些关于使用 tf.convert_to_tensor函数的东西。我尝试通过这个函数传递我的培训和测试列表,但是函数不接受它们。

314065 次浏览

几个可能的错误,大部分与 x = np.asarray(x).astype('float32')固定。

其他的可能是错误的数据预处理; 确保一切都是 格式正确(分类,奶,字符串等):

[print(i.shape, i.dtype) for i in model.inputs]
[print(o.shape, o.dtype) for o in model.outputs]
[print(l.name, l.input_shape, l.dtype) for l in model.layers]

问题的根源在于使用 清单作为输入,而不是 Numpy 数组,Keras/TF 不支持前者。一个简单的转换是: x_array = np.asarray(x_list)

下一步是确保以预期的格式提供数据; 对于 LSTM,这将是一个维度为 (batch_size, timesteps, features)的3D 张量——或者等效于 (num_samples, timesteps, channels)。最后,作为一个调试专业技巧,打印所有的形状为您的数据。完成上述所有工作的代码如下:

Sequences = np.asarray(Sequences)
Targets   = np.asarray(Targets)
show_shapes()


Sequences = np.expand_dims(Sequences, -1)
Targets   = np.expand_dims(Targets, -1)
show_shapes()
# OUTPUTS
Expected: (num_samples, timesteps, channels)
Sequences: (200, 1000)
Targets:   (200,)


Expected: (num_samples, timesteps, channels)
Sequences: (200, 1000, 1)
Targets:   (200, 1)

作为一个额外的提示,我注意到您是通过 main()运行的,因此您的 IDE 可能缺少类似于 Jupiter 的基于单元格的执行; 我强烈推荐使用 Spyder IDE。这很简单,只需添加 # In[],然后按下面的 Ctrl + Enter:


使用的函数 :

def show_shapes(): # can make yours to take inputs; this'll use local variable values
print("Expected: (num_samples, timesteps, channels)")
print("Sequences: {}".format(Sequences.shape))
print("Targets:   {}".format(Targets.shape))

也可能由于版本的差异而发生(我不得不从 tensorflow 2.1.0回到2.0.0。Beta1来解决这个问题)。

在尝试了以上所有方法都没有成功之后,我发现我的问题在于数据中的一列具有 boolean值。把所有东西转换成 np.float32解决了这个问题!

import numpy as np


X = np.asarray(X).astype(np.float32)

我有许多不同的输入和目标变量,不知道是哪一个导致了问题。

为了找出哪个变量中断了,你可以使用堆栈路径中指定的路径在库包中添加一个打印值:

      File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 96, in convert_to_eager_tensor
return ops.EagerTensor(value, ctx.device_name,

在这部分代码中添加一个 print语句可以让我看到是哪个输入导致了这个问题:

返回文章页面

  ....
dtype = dtype.as_datatype_enum
except AttributeError:
dtype = dtypes.as_dtype(dtype).as_datatype_enum
ctx.ensure_initialized()
print(value) # <--------------------- PUT PRINT HERE
return ops.EagerTensor(value, ctx.device_name, dtype)

在观察到从 intastype(np.float32)的转换中哪个值有问题之后,问题得到了解决。

您最好使用这个,因为 Keras 的版本不兼容

from keras import backend as K
X_train1 = K.cast_to_floatx(X_train)
y_train1 = K.cast_to_floatx(y_train)

这是一个高度误导性的错误,因为这基本上是一个一般性错误,可能与浮点数没有任何关系。

例如,在我的例子中,它是由熊猫数据框的一个字符串列引起的,其中包含一些 np.NaN值。想想吧!

修正了用空字符串替换它们的问题:

df.fillna(value='', inplace=True)

或者更具体地说,仅对字符串(例如“ object”)列执行此操作:

cols = df.select_dtypes(include=['object'])
for col in cols.columns.values:
df[col] = df[col].fillna('')

您可能希望检查输入数据集或数组中的数据类型,然后将其转换为 float32:

train_X[:2, :].view()
#array([[4.6, 3.1, 1.5, 0.2],
#       [5.9, 3.0, 5.1, 1.8]], dtype=object)
train_X = train_X.astype(np.float32)
#array([[4.6, 3.1, 1.5, 0.2],
#       [5.9, 3. , 5.1, 1.8]], dtype=float32)

这应该会奏效:

x_train = np.asarray(x_train).astype(np.float32)
y_train = np.asarray(y_train).astype(np.float32)

如果使用 DataFrame 并且具有多个列类型,请使用此选项:

numeric_list = df.select_dtypes(include=[np.number]).columns
df[numeric_list] = df[numeric_list].astype(np.float32)

尝试将 np.float32转换为 tf.float32(读取 keras 和 tensorflow 的数据类型) :

Convert _ to _ tensor (X _ train,dtype = tf.float32)

在我的情况下,它没有工作,投到 np.float32

对于我来说,在训练期间一切运行正常(可能是因为我使用 tf.data.Dataset.from_generator作为 fit()的输入) ,但是当我试图在1个实例上调用 predict()(使用 np.array)时,出现了错误。

作为一个解决方案,我必须在调用預之前重新设置数组 x_array.reshape(1, -1)的形状,而且它起作用了。

我通过在数据导入期间强制执行浮点格式来避免这个问题:

Df = pd.read _ csv (‘ titanic.csv’,dtype = ‘ float’)

只是遇到了同样的问题,结果是因为我试图传递一个数组对象数组,而不是像预期的那样传递一个数组数组。希望这对将来的人有所帮助!

试试看

X_train =t ensorflow.convert_to_tensor(X_train, dtype=tensorflow.float32)
y_train = tensorflow.convert_to_tensor(y_train, dtype=tensorflow.float32)
X_test = tensorflow.convert_to_tensor(X_test, dtype=tensorflow.float32)
y_test = tensorflow.convert_to_tensor(y_test, dtype=tensorflow.float32)

正如上面大多数人所回答的,用 np.float32 / float32中的各种方法转换数据已经在这里讲过了。

当这样做时,如果你得到另一个错误是“ ValueError: setting an array element with a sequence”。

在这种情况下,尝试将数据转换为 type list,然后像前面那样将其转换为类型张量。