tensorflowconv-neural-networkkeras-layerintrusion-detection

How to solve ValueError in model.predict()?


I am new in neural network problems. I have searched for couple of hours but could not understand what should I do to fix this issue! I'm working with nsl-kdd dataset for intrusion detection system with convolutional neural net.

I stuck with this problem : ValueError: Input 0 of layer dense_14 is incompatible with the layer: expected axis -1 of input shape to have value 3904 but received input with shape [None, 3712]

Shapes:

x_train (125973, 122)

y_train (125973, 5)

x_test (22544, 116)

y_test (22544,)

After reshape :

x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1)) #(125973, 122, 1)

x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1)) #(22544, 116, 1)

Model :

model = Sequential()
model.add(Convolution1D(64, 3, padding="same",activation="relu",input_shape = (x_train.shape[1], 1)))
model.add(MaxPooling1D(pool_size=(2)))
model.add(Flatten())
model.add(Dense(128, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(5, activation="softmax"))

Compile :

model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.fit(x_train, Y_train, epochs = 5, batch_size = 32)

pred = model.predict(x_test)  #problem is occurring for this line
y_pred= np.argmax(pred, axis = 1)

model summary


Solution

  • Your x_test should have same dimensions as x_train.
    x_train = (125973, 122, 1)

    x_test = (22544, 116, 1) # the second parameter must match the train set

    Code sample:

    import tensorflow as tf
    import pandas as pd 
    import numpy as np
    from tensorflow.keras.layers import *
    from tensorflow.keras import *
    
    
    x1 = np.random.uniform(100, size =(125973, 122,1))
    x2 = np.random.uniform(100, size =(22544, 122, 1))
    y1 = np.random.randint(100, size =(125973,5), dtype = np.int32)
    y2 = np.random.randint(2, size =(22544, ), dtype = np.int32)
    
    def create_model2():
        model = Sequential()
        model.add(Convolution1D(64, 3, padding="same",activation="relu",input_shape = (x1.shape[1], 1)))
        model.add(MaxPooling1D(pool_size=(2)))
        model.add(Flatten())
        model.add(Dense(128, activation="relu"))
        model.add(Dropout(0.5))
        model.add(Dense(5, activation="softmax"))
        
        model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
        return model
    
    model = create_model2()
    tf.keras.utils.plot_model(model, 'my_first_model.png', show_shapes=True)
    

    You model looks like this:

    this

    Now if use your test set to create your model keeping your dimension as (22544, 116, 1).
    You get a model that looks this.
    As the dimensions are different the expected input and output of each layers are different.

    this

    When you have appropriate test dimensions the output works as expected:

    pred = model.predict(x2)
    pred
    

    Output:

    array([[1., 0., 0., 0., 0.],
           [1., 0., 0., 0., 0.],
           [1., 0., 0., 0., 0.],
           ...,
           [1., 0., 0., 0., 0.],
           [1., 0., 0., 0., 0.],
           [1., 0., 0., 0., 0.]], dtype=float32)