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

时间:2019-10-31 02:18:03

标签: python tensorflow keras lstm

上一个问题的继续:Tensorflow - TypeError: 'int' object is not iterable

我的训练数据是一个列表列表,每个列表包含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:\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函数的信息。我试图通过它来传递训练和测试列表,但是该功能不会接受它们。

任何帮助将不胜感激。谢谢。

10 个答案:

答案 0 :(得分:40)

在尝试了上述所有方法均未成功后,我发现我的问题是数据中的一列具有boolean值。将所有内容转换为np.float32即可解决问题!

import numpy as np

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

答案 1 :(得分:7)

这是一个极具误导性的错误,因为这基本上是一个普遍的错误,可能与浮点数无关。

例如,在我的情况下,这是由其中包含一些np.NaN值的pandas数据帧的字符串列引起的。走吧!

通过将其替换为空字符串来解决:

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

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

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

答案 2 :(得分:4)

也可能由于版本不同而发生(为了解决此问题,我不得不从tensorflow 2.1.0移回2.0.0.beta1)。

答案 3 :(得分:2)

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

下一步是确保以预期的格式输入数据;对于LSTM,将是尺寸为(batch_size, timesteps, features)或等效为(num_samples, timesteps, channels)的3D张量。最后,作为调试提示,打印所有形状的数据。完成上述所有任务的代码如下:

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

答案 4 :(得分:1)

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

要找出中断变量的位置,您可以使用堆栈strace中指定的路径在库包中添加打印值:

      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语句,使我能够查看导致问题的输入:

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)

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

答案 5 :(得分:1)

您可能要检查输入数据集或数组中的数据类型,然后将其转换为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)

答案 6 :(得分:0)

您最好使用它,这是因为keras版本不兼容

test'

答案 7 :(得分:0)

这应该可以解决问题:

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

tf.convert_to_tensor(X_train, dtype=tf.float32)