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() ...

问题描述:

上一个问题的延续: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_corepythonrameworkops.py", line 1184, in convert_to_tensor
        return convert_to_tensor_v2(value, dtype, preferred_dtype, name)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages    ensorflow_corepythonrameworkops.py", line 1242, in convert_to_tensor_v2
        as_ref=False)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages    ensorflow_corepythonrameworkops.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_corepythonramework    ensor_conversion_registry.py", line 52, in _default_conversion_function
        return constant_op.constant(value, dtype, name=name)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages    ensorflow_corepythonrameworkconstant_op.py", line 227, in constant
        allow_broadcast=True)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages    ensorflow_corepythonrameworkconstant_op.py", line 235, in _constant_impl
        t = convert_to_eager_tensor(value, ctx, dtype)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages    ensorflow_corepythonrameworkconstant_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下面一样简单:

IT科技


使用的功能

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_corepythonrameworkconstant_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 类型,结构如下-

  1. 第 5 级 - 批次(由于我的批次大小为 100 个样本,训练集包含 1000 个项目,因此批次由 10 个批次组成)

  2. 级别 4 - X 和 Y 变量(2 个 n 维 numpy 数组的元组,一个代表 x 变量,另一个代表批次的 y 变量)

  3. 第 3 级 3 维 nd numpy 数组,每个数组包含 100 个样本 - 对于 X 变量,数组为 100(批量大小)x20(序列长度)x10(特征数量);对于 Y 变量,最后一个维度的大小为 1,而不是 10

  4. 第 2 级 - 每个样本都是一个二维数组,其中 x 为 20(序列长度)x10(特征数量),y 变量为 20x1

  5. 级别 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')
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用