0

I'm trying to do action recognition on KTH dataset with 6 classes. The model i'm using is Keras convo3d. I'm kinda new to this so I can't understand where have I gone wrong. All the preprocessing is working fine but model is having issues. can some one help me please

its something about the shape which i don't get

here is the code


(X_train, y_train) = (train_data[0], train_data[1])
print('X_Train shape:', X_train.shape)

train_set = np.zeros((num_samples, 1, img_rows, img_cols, img_depth))

for h in range(num_samples):
    train_set[h][0][:][:][:] = X_train[h, :, :, :]

patch_size = 15  # img_depth or number of frames used for each video

print(train_set.shape, 'train samples')

# CNN Training parameters

batch_size = 2
nb_classes = 6
nb_epoch = 50
#
# # convert class vectors to binary class matrices
Y_train = keras.utils.to_categorical(y_train, nb_classes)

# number of convolutional filters to use at each layer
nb_filters = [32, 32]

# level of pooling to perform at each layer (POOL x POOL)
nb_pool = [3, 3]

# level of convolution to perform at each layer (CONV x CONV)
nb_conv = [5, 5]

#Pre-processing

train_set = train_set.astype('float32')

train_set -= np.mean(train_set)

train_set /= np.max(train_set)

# # Define model
#
model = keras.Sequential()
model.add(layers.Convolution3D(nb_filters[0], kernel_size=(5, 5, 5), input_shape=(img_rows, img_cols, img_depth , 1),
                               activation='relu'))

model.add(layers.MaxPooling3D(pool_size=(nb_pool[0], nb_pool[0], nb_pool[0])))

model.add(layers.Dropout(0.5))

model.add(layers.Flatten())

model.add(layers.Dense(128, activation='relu'))

model.add(layers.Dropout(0.5))

model.add(layers.Dense(nb_classes))

model.add(layers.Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='RMSprop')
#
# # Split the data
#
X_train_new, X_val_new, y_train_new, y_val_new = train_test_split(train_set, Y_train, test_size=0.2, random_state=4)

# Train the model

hist = model.fit(X_train_new, y_train_new, validation_data=(X_val_new, y_val_new),
                 batch_size=batch_size, epochs=nb_epoch, show_accuracy=True, shuffle=True)

# Evaluate the model
score = model.evaluate(X_val_new, y_val_new, batch_size=batch_size)
print('Test score:', score[0])
print('Test accuracy:', score[1])

No. of Samples : 599
X_Train shape: (599, 16, 16, 15)

(599, 1, 16, 16, 15) train samples

input shape is : (1, 16, 16, 15)

here is the error

Epoch 1/50
Traceback (most recent call last):
  File "E:/semester 6/FYP/KTH Action Recognition/method2/KTHCondaCNN/main.py", line 334, in <module>
    hist = model.fit(X_train_new, y_train_new, validation_data=(X_val_new, y_val_new),
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1098, in fit
    tmp_logs = train_function(iterator)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\eager\def_function.py", line 780, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\eager\def_function.py", line 823, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\eager\def_function.py", line 696, in _initialize
    self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\eager\function.py", line 2855, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\eager\function.py", line 3213, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\eager\function.py", line 3065, in _create_graph_function
    func_graph_module.func_graph_from_py_func(
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\framework\func_graph.py", line 986, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\eager\def_function.py", line 600, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\framework\func_graph.py", line 973, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\training.py:806 train_function  *
        return step_function(self, iterator)
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\training.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\training.py:789 run_step  **
        outputs = model.train_step(data)
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\training.py:747 train_step
        y_pred = self(x, training=True)
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\base_layer.py:975 __call__
        input_spec.assert_input_compatibility(self.input_spec, inputs,
    C:\Users\probook 430\miniconda3\envs\KTHCondaCNN\lib\site-packages\tensorflow\python\keras\engine\input_spec.py:212 assert_input_compatibility
        raise ValueError(

    ValueError: Input 0 of layer sequential is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [None, 1, 16, 16, 15]


Process finished with exit code 1

1 Answer 1

1

The input shape of your images should be (batch_size, height, width, depth, channels) (see docs), so it seems that your X_train sample is missing the channels dimension.

Below you can see that the model is working with the proper input dimensions. Notice that the first 1 in X is needed to account for the batch size, while the last for the number of channels.

model = keras.Sequential()
model.add(layers.Convolution3D(2, kernel_size=(5, 5, 5), input_shape=(16, 16, 15,1),
                               activation='relu'))

model.add(layers.MaxPooling3D(pool_size=(3, 3, 3)))

model.add(layers.Dropout(0.5))

model.add(layers.Flatten())

model.add(layers.Dense(128, activation='relu'))

model.add(layers.Dropout(0.5))

model.add(layers.Dense(10))

model.add(layers.Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='RMSprop')

X = tf.ones([1,16,16,15,1]) # Correct input dimensions
model(X)
# Output:
# <tf.Tensor: shape=(1, 10), dtype=float32, 
#numpy=array([[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]], dtype=float32)>
Sign up to request clarification or add additional context in comments.

4 Comments

I've have given input shape like (1,16,16,15,1) but now its giving another error ValueError: Input 0 of layer max_pooling3d is incompatible with the layer: expected ndim=5, found ndim=6. Full shape received: [None, 1, 12, 12, 11, 2]
Sorry, probably I've put it badly. The correspondence between your train sample and the expected input should be (599, 16, 16, 15, 1) - > (batch size, height, width, channels) and not (599, 1, 16, 16, 15, 1).
I think now i'm doing wrong here " train_set = np.zeros((num_samples, 1, img_rows, img_cols, img_depth)) " I have converted it into ((num_samples , rows, cols, depth, 1)) format but now I don't understand how to broadcast it like this code is giving error now " for h in range(num_samples): train_set[h][0][:][:][:] = X_train[h, :, :, :] "
If everything before model.fit is fine you can try to just reshape the input sample. X_train = X_train.reshape(599, 16, 16, 15, 1)

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.