maurock
maurock

Reputation: 541

Keras and Error: Setting an array element with a sequence

I have a problem with the input of multiple data sources in my neural network. My dataframe is:

                           0  1  2                   3   4  
0        [True, True, False]  3 -1  [False, True, True]  1

The input is related to the first 4 columns, the output is the last one. When I train my neural network I get Setting an array element with a sequence.

def network():
        model = Sequential()
        model.add(Dense(output_dim=50, activation='relu', input_dim=4))
        model.add(Dense(output_dim=50, activation='relu'))
        model.add(Dense(output_dim=50, activation='relu'))
        model.add(Dense(output_dim=1, activation='softmax'))
        opt = RMSprop(lr=0.00025)
        model.compile(loss='mse', optimizer=opt)
        return model

    data = pd.DataFrame()
    state = [0]*3
    for i in range(3):
        state[i]= random.choice([True, False])
    move = random.randint(1,4)
    reward = random.choice([-1, -10, 10])
    future_state = [0]*3
    for i in range(3):
        future_state[i] = random.choice([True, False])
    Q = 1
    array = [state, move, reward, future_state, Q]

    data = data.append([array])
    training = data.drop([4], axis = 1)
    target = data[4]
    model = network()
    model.fit(training,target,epochs=2)

Python traceback:

Traceback (most recent call last):
  File "D:/Documents/PycharmProjects/SnakeGA/try.py", line 33, in <module>
    model.fit(training,target,epochs=2)
  File "D:\Anaconda3\lib\site-packages\keras\models.py", line 845, in fit
    initial_epoch=initial_epoch)
  File "D:\Anaconda3\lib\site-packages\keras\engine\training.py", line 1485, in fit
    initial_epoch=initial_epoch)
  File "D:\Anaconda3\lib\site-packages\keras\engine\training.py", line 1140, in _fit_loop
    outs = f(ins_batch)
  File "D:\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py", line 2075, in __call__
    feed_dict=feed_dict)
  File "D:\Anaconda3\lib\site-packages\tensorflow\python\client\session.py", line 900, in run
    run_metadata_ptr)
  File "D:\Anaconda3\lib\site-packages\tensorflow\python\client\session.py", line 1104, in _run
    np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
  File "D:\Anaconda3\lib\site-packages\numpy\core\numeric.py", line 492, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.

Is this due to the fact that I have arrays in some columns, and integers in other columns? I thought Keras could handle that, but maybe I'm wrong. It's not clear to me how to handle concatenated data from multiple sources. Thank you!

Upvotes: 4

Views: 2222

Answers (3)

Sridhar Murali
Sridhar Murali

Reputation: 380

You are trying to input 2 different types of data to the neuron of a neural network. Neural networks isn't a magical box to throw random information into it and expect it to give a reasonable output.

NN's take only numbers as input. When you flatten your data

[False, False, True, 4, -10, False, True, False, 1] to this format, what you are effectively doing is converting it into this [0,0,1,4,-10,0,1,0,1].

I am not really sure what you want from this data but, if you want only 5 features, you can take the majority outcome for those with binary values.

arr = [[False, False, True], 4, -10, [False, True, False], 1]

can be converted to

arr = [False,4,-10,False,1]

which effectively means your input is

arr=[0,4,-10,0,1]

But, before you do this, be sure what you're trying to do makes sense. You need to be able to answer questions like "what does each value represent?", "do i need to normalize the data?", "Would True/False in this dataset make sense?".

Upvotes: 1

Shadi
Shadi

Reputation: 10335

The list inside the numpy array needs to be flattened before insertion.

array is [[False, False, True], 4, -10, [False, True, False], 1] in the OP implementation,

and should be flattened to [False, False, True, 4, -10, False, True, False, 1].

Here is a working jupyter notebook demonstrating this.

Upvotes: 3

Anurag Sharma
Anurag Sharma

Reputation: 167

First of all, convert the input array into numpy array and convert the categorical boolean inputs into numbers. Then, give input dimension = 8 instead of 4.

Upvotes: 1

Related Questions