Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tensorflow - ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float)

Continuation from previous question: Tensorflow - TypeError: 'int' object is not iterable

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, ...] 

Here is my model:

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

Here is the error I'm getting:

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

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.

like image 605
SuperHanz98 Avatar asked Oct 31 '19 02:10

SuperHanz98


People also ask

What is Dtype object?

A data type object (an instance of numpy. dtype class) describes how the bytes in the fixed-size block of memory corresponding to an array item should be interpreted. It describes the following aspects of the data: Type of the data (integer, float, Python object, etc.)


2 Answers

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

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] 

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

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) 

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:


Function used:

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))    
like image 134
OverLordGoldDragon Avatar answered Sep 20 '22 04:09

OverLordGoldDragon


After trying everything above with no success, I found that my problem was that one of the columns from my data had boolean values. Converting everything into np.float32 solved the issue!

import numpy as np  X = np.asarray(X).astype(np.float32) 
like image 33
Vasco Cansado Carvalho Avatar answered Sep 17 '22 04:09

Vasco Cansado Carvalho