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

后端 未结 8 1379
情歌与酒
情歌与酒 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: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))   
    

提交回复
热议问题