1

I'm trying to train a neural network using tensorflow.keras, but I don't understand how do I train it with a numpy array of list (in python3).

I have tried to change the input shape of the layers, but I don't really understand how it's work.

import tensorflow as tf
from tensorflow import keras
import numpy as np

# Create the array of data

train_data = [[1.0,2.0,3.0],[4.0,5.0,6.0]]
train_data_np = np.asarray(train_data)
train_label = [[1,2,3],[4,5,6]]
train_label_np = np.asarray(train_data)

### Build the model

model = keras.Sequential([
    keras.layers.Dense(3,input_shape =(3,2)),
    keras.layers.Dense(3,activation=tf.nn.sigmoid)
])

model.compile(optimizer='sgd',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

#Train the model

model.fit(train_data_np,train_label_np,epochs=10)

The error is "Error when checking input: expected dense_input to have 3 dimensions, but got array with shape (2, 3)" when model.fit is called.

1
  • 1
    either you use a convolutional layer for 2D arrays (shape 3,2) or you have to flatten your array, so the shape is 3, for use with Dense layers. And I don't know how your last layer with a sigmoid function can fit a 2, 3, 4, 5 or even 6. Your train label would be [[1,0,0], [0,1,0]] for example... Try to read an introduction to Keras Commented Apr 4, 2019 at 6:55

1 Answer 1

3

While defining a Keras model, you have to provide input shape to the first layer of the model.

For example, if your training data have n rows and m features ie shape : (n, m), You have to set the input_shape of the first Dense layer of the model to (m, ) ie the model should expect m features coming into it.

Now coming to your toy data,

train_data = [[1.0,2.0,3.0],[4.0,5.0,6.0]]
train_data_np = np.asarray(train_data)
train_label = [[1,2,3],[4,5,6]]
train_label_np = np.asarray(train_label)

Here, train_data_np.shape is (2, 3) ie 2 rows and 3 features, then you have to define the model like this,

model = keras.Sequential([
    keras.layers.Dense(3,input_shape =(3, )),
    keras.layers.Dense(3,activation=tf.nn.sigmoid)
])

Now, your labels are [[1,2,3],[4,5,6]]. In the normal 3 class classification task this will be a one-hot vector with 1 and 0s. But let's leave that aside as this is a toy example to check Keras.

If the target label ie y_train is one-hot then you have to use categorical_crossentropy loss instead of sparse_categorical_crossentropy.

So you can compile and train the model like this

model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])

#Train the model

model.fit(train_data_np,train_label_np,epochs=10)


Epoch 1/10
2/2 [==============================] - 0s 61ms/step - loss: 11.5406 - acc: 0.0000e+00
Epoch 2/10
2/2 [==============================] - 0s 0us/step - loss: 11.4970 - acc: 0.5000
Epoch 3/10
2/2 [==============================] - 0s 0us/step - loss: 11.4664 - acc: 0.5000
Epoch 4/10
2/2 [==============================] - 0s 498us/step - loss: 11.4430 - acc: 0.5000
Epoch 5/10
2/2 [==============================] - 0s 496us/step - loss: 11.4243 - acc: 1.0000
Epoch 6/10
2/2 [==============================] - 0s 483us/step - loss: 11.4087 - acc: 1.0000
Epoch 7/10
2/2 [==============================] - 0s 1ms/step - loss: 11.3954 - acc: 1.0000
Epoch 8/10
2/2 [==============================] - 0s 997us/step - loss: 11.3840 - acc: 1.0000
Epoch 9/10
2/2 [==============================] - 0s 1ms/step - loss: 11.3740 - acc: 1.0000
Epoch 10/10
2/2 [==============================] - 0s 995us/step - loss: 11.3653 - acc: 1.0000
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.