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

后端 未结 8 1345
情歌与酒
情歌与酒 2020-12-01 13:45

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

My training data is a list of lists each comprised of 1000 floats. F

相关标签:
8条回答
  • 2020-12-01 14:09

    Could also happen due to a difference in versions (I had to move back from tensorflow 2.1.0 to 2.0.0.beta1 in order to solve this issue).

    0 讨论(0)
  • 2020-12-01 14:10

    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)
    
    0 讨论(0)
  • 2020-12-01 14:17

    This should do the trick:

    x_train = np.asarray(x_train).astype(np.float32)
    y_train = np.asarray(y_train).astype(np.float32)
    
    0 讨论(0)
  • 2020-12-01 14:20

    I had many different inputs and target variables and didn't know which one was causing the problem.

    To find out on which variable it breaks you can add a print value in the library package using the path is specified in your stack 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, 
    

    Adding a print statement in this part of the code allowed me to see which input was causing the problem:

    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)
    

    After observing which value was problematic conversion from int to astype(np.float32) resolved the problem.

    0 讨论(0)
  • 2020-12-01 14:21

    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))   
    
    0 讨论(0)
  • 2020-12-01 14:21

    You'd better use this, it is because of the uncompatible version of keras

    from keras import backend as K
    X_train1 = K.cast_to_floatx(X_train)
    y_train1 = K.cast_to_floatx(y_train)
    
    0 讨论(0)
提交回复
热议问题