Tensorflow - ValueError:无法将 NumPy 数组转换为 Tensor(不支持的对象类型浮点数)
- 2025-02-10 08:57:00
- admin 原创
- 52
问题描述:
上一个问题的延续:Tensorflow - TypeError: 'int' 对象不可迭代
我的训练数据是一串列表,每个列表由 1000 个浮点数组成。例如,x_train[0] =
[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:UsersencuDesktopProjectFilesCodeProgram.py", line 88, in FitModel
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonkerasengine raining.py", line 728, in fit
use_multiprocessing=use_multiprocessing)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonkerasengine raining_v2.py", line 224, in fit
distribution_strategy=strategy)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonkerasengine raining_v2.py", line 547, in _process_training_inputs
use_multiprocessing=use_multiprocessing)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonkerasengine raining_v2.py", line 606, in _process_inputs
use_multiprocessing=use_multiprocessing)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonkerasenginedata_adapter.py", line 479, in __init__
batch_size=batch_size, shuffle=shuffle, **kwargs)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonkerasenginedata_adapter.py", line 321, in __init__
dataset_ops.DatasetV2.from_tensors(inputs).repeat()
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythondataopsdataset_ops.py", line 414, in from_tensors
return TensorDataset(tensors)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythondataopsdataset_ops.py", line 2335, in __init__
element = structure.normalize_element(element)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythondata/utilstructure.py", line 111, in normalize_element
ops.convert_to_tensor(t, name="component_%d" % i))
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonrameworkops.py", line 1184, in convert_to_tensor
return convert_to_tensor_v2(value, dtype, preferred_dtype, name)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonrameworkops.py", line 1242, in convert_to_tensor_v2
as_ref=False)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonrameworkops.py", line 1296, in internal_convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonramework ensor_conversion_registry.py", line 52, in _default_conversion_function
return constant_op.constant(value, dtype, name=name)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonrameworkconstant_op.py", line 227, in constant
allow_broadcast=True)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonrameworkconstant_op.py", line 235, in _constant_impl
t = convert_to_eager_tensor(value, ctx, dtype)
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonrameworkconstant_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
函数的信息。我尝试通过此函数传递我的训练和测试列表,但该函数不会接受它们。
解决方案 1:
TL;DR可能存在几种错误,大部分已用 修复x = np.asarray(x).astype('float32')
。
其他原因可能是数据预处理有误;确保所有内容格式正确(分类、nan、字符串等)。下面显示了模型的预期结果:
[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,这将是一个具有维度的 3D 张量(batch_size, timesteps, features)
- 或者等效地。(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 可能缺少类似 Jupyter 的基于单元格的执行;我强烈推荐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))
解决方案 2:
尝试了上述所有方法均未成功,我发现问题在于数据中的其中一列有boolean
值。将所有内容转换为np.float32
解决了问题!
import numpy as np
X = np.asarray(X).astype(np.float32)
解决方案 3:
这应该可以解决问题:
x_train = np.asarray(x_train).astype(np.float32)
y_train = np.asarray(y_train).astype(np.float32)
解决方案 4:
这是一个极具误导性的错误,因为这基本上是一个一般错误,可能与浮点数无关。
例如,在我的例子中,这是由 pandas 数据框的字符串列np.NaN
中包含一些值引起的。想想吧!
通过用空字符串替换它们来修复它:
df.fillna(value='', inplace=True)
或者更具体地说,仅对字符串(例如“对象”)列执行此操作:
cols = df.select_dtypes(include=['object'])
for col in cols.columns.values:
df[col] = df[col].fillna('')
解决方案 5:
尝试将 np.float32 转换为 tf.float32(读取 keras 和 tensorflow 的数据类型):
tf.convert_to_tensor(X_train, dtype=tf.float32)
解决方案 6:
我有许多不同的输入和目标变量,但不知道哪一个导致了问题。
要找出哪个变量中断了,您可以使用堆栈 strace 中指定的路径在库包中添加打印值:
File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages ensorflow_corepythonrameworkconstant_op.py", line 96, in convert_to_eager_tensor
return ops.EagerTensor(value, ctx.device_name,
print
在代码的这一部分添加一条语句使我能够看到哪个输入导致了问题:
constant_op.py
:
....
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)
在观察了哪个值有问题之后,从int
到的转换astype(np.float32)
解决了问题。
解决方案 7:
也可能由于版本差异而发生(为了解决这个问题,我不得不从 tensorflow 2.1.0 移回 2.0.0.beta1)。
解决方案 8:
您可能需要检查输入数据集或数组中的数据类型,然后将其转换为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)
解决方案 9:
np.float32 / float32
正如上面大多数人所回答的那样,通过这里已经讲过的各种方式转换数据。
执行此操作时如果您收到另一个错误“ ValueError: setting an array element with a sequence
”。
在这种情况下,尝试将您的数据转换为type list
,然后将其转换为张量类型,就像您之前尝试的那样。
解决方案 10:
你最好用这个,这是因为keras版本不兼容
from keras import backend as K
X_train1 = K.cast_to_floatx(X_train)
y_train1 = K.cast_to_floatx(y_train)
解决方案 11:
如果您使用 DataFrame 并且具有多个列类型,请使用此项:
numeric_list = df.select_dtypes(include=[np.number]).columns
df[numeric_list] = df[numeric_list].astype(np.float32)
解决方案 12:
刚刚遇到了同样的问题,最终是因为我试图传递一个数组对象数组,而不是预期的数组数组。
解决方案 13:
尝试
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)
解决方案 14:
我遇到了一些熊猫系列的同样的问题,认为
data = my_series.to_numpy()
就足够了,但它只能提供一个 Object dtype,并且强制为 float64 或其他不起作用的类型。
这个问题已经通过使用
data = my_series.to_list()
而是。然后
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
按预期工作。
解决方案 15:
OverLordGoldDragon 的精选答案为我的情况提供了宝贵的线索,但我不得不花几个小时尝试纠正我的具体情况。因此,在这里添加一些注释以帮助处于类似情况的其他人。
model.fit()
我正在通过模块中的 TimeseriesGenerator 类生成 keras.Sequential 的输入keras.preprocessing.sequences
。该类输出一个 5d 序列,其中包含 python 内置的 int/float 类型,结构如下-
第 5 级 - 批次(由于我的批次大小为 100 个样本,训练集包含 1000 个项目,因此批次由 10 个批次组成)
级别 4 - X 和 Y 变量(2 个 n 维 numpy 数组的元组,一个代表 x 变量,另一个代表批次的 y 变量)
第 3 级 3 维 nd numpy 数组,每个数组包含 100 个样本 - 对于 X 变量,数组为 100(批量大小)x20(序列长度)x10(特征数量);对于 Y 变量,最后一个维度的大小为 1,而不是 10
第 2 级 - 每个样本都是一个二维数组,其中 x 为 20(序列长度)x10(特征数量),y 变量为 20x1
级别 1 - 是原生 Python 类型的标量
当我按照这里的建议并尝试将此数据结构转换为时x = np.asarray(x).astype('float32')
,失败了,因为 TimeseriesGenerator 的标准输出在前两个级别有元组而不是数组/列表,它们是不可变的并且长度不均匀(因为最后一批的样本比其他的少,因为它只能接受剩余的样本数(在我的情况下是 79 个))。
我尝试了很多方法使这种转换在TimeseriesGEnerator 的输出上起作用,但最终我发现最简单的解决方案是使用建议的方法 ( ) 将输入显式转换为 TimeseriesGenerator 构造函数x = np.asarray(x).astype('float32')
。问题是这些 numpy nd 数组是由预处理管道输出的,这些管道保留了原生 python int 和 float 类型。一旦我将这些数组转换为 numpy float32 类型,model.fit() 就会停止给出 ValueError,因为无法将 NumpyArray 转换为 TensorFlow。
解决方案 16:
就我而言,转换为 不起作用np.float32
。
对我来说,训练期间一切都正常运行(可能是因为我使用tf.data.Dataset.from_generator
它作为输入fit()
),但是当我尝试调用predict()
1 个实例(使用 np.array)时,出现错误。
x_array.reshape(1, -1)
作为解决方案,我必须在调用预测之前重塑数组,然后它才有效。
解决方案 17:
首先检查数据的格式,我建议你使用 LabelEncoder 和 StandardScaler 对数据进行比例标准化。为此,
from sklearn.preprocessing import LabelEncoder, StandardScaler
X = lbl_encoder_1.fit_transform(X)
将X拆分为训练和测试后:
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)
现在设置模型然后运行:
model.fit(X_train, y_train, batch_size = 10, epochs = 100)
希望它能起作用,并且您不会看到该错误。如果您仍然看到错误,请尝试执行以下操作:
x_train = np.asarray(x_train).astype(np.float32)
y 也一样
解决方案 18:
我通过在数据导入期间强制使用浮点格式来避免这个问题:
df = pd.read_csv('titanic.csv', dtype='float')
解决方案 19:
该错误是由需要转换为浮点数的布尔列引起的。以下方法可解决问题:
for col in X_train.select_dtypes(include='bool').columns:
X_train[col] = X_train[col].astype('float')
X_test[col] = X_test[col].astype('float')