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

问题描述

继续上一个问题:Tensorflow - TypeError: 'int' 对象不可迭代

我的训练数据是一个列表,每个列表包含 1000 个浮点数.例如,x_train[0] =

My training data is a list of lists each comprised of 1000 floats. For example, 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_corepythondatautilstructure.py", line 111, in normalize_element
        ops.convert_to_tensor(t, name="component_%d" % i))
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages	ensorflow_corepythonframeworkops.py", line 1184, in convert_to_tensor
        return convert_to_tensor_v2(value, dtype, preferred_dtype, name)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages	ensorflow_corepythonframeworkops.py", line 1242, in convert_to_tensor_v2
        as_ref=False)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages	ensorflow_corepythonframeworkops.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_corepythonframework	ensor_conversion_registry.py", line 52, in _default_conversion_function
        return constant_op.constant(value, dtype, name=name)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages	ensorflow_corepythonframeworkconstant_op.py", line 227, in constant
        allow_broadcast=True)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages	ensorflow_corepythonframeworkconstant_op.py", line 235, in _constant_impl
        t = convert_to_eager_tensor(value, ctx, dtype)
      File "C:UsersencuAppDataLocalProgramsPythonPython37libsite-packages	ensorflow_corepythonframeworkconstant_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 函数的信息.我尝试通过这个传递我的训练和测试列表,但函数不会接受它们.

I've tried googling the error myself, I found something about using the tf.convert_to_tensor function. I tried passing my training and testing lists through this but the function won't take them.

推荐答案

TL;DR 几个可能的错误,大部分用 x = np.asarray(x).astype('float32').

TL;DR Several possible errors, most fixed with x = np.asarray(x).astype('float32').

其他可能是数据预处理有问题;确保所有内容格式正确(分类、nans、字符串等).下面显示了模型的期望:

Others may be faulty data preprocessing; ensure everything is properly formatted (categoricals, nans, strings, etc). Below shows what the model expects:

[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]

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


The problem's rooted in using lists as inputs, as opposed to Numpy arrays; Keras/TF doesn't support former. A simple conversion is: x_array = np.asarray(x_list).

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

The next step's to ensure data is fed in expected format; for LSTM, that'd be a 3D tensor with dimensions (batch_size, timesteps, features) - or equivalently, (num_samples, timesteps, channels). Lastly, as a debug pro-tip, print ALL the shapes for your data. Code accomplishing all of the above, below:

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 一样简单:


As a bonus tip, I notice you're running via main(), so your IDE probably lacks a Jupyter-like cell-based execution; I strongly recommend the Spyder IDE. It's as simple as adding # In[], and pressing Ctrl + Enter below:

使用的函数:

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 - ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型浮点数)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-03 09:26