Ввод 0 последовательного слоя несовместим с: ожидалось, что ось -1 входной формы будет иметь значение 1, но был получен ввод с формой [Нет, 1, 16, 16, 15]

#tensorflow #image-processing #keras #deep-learning #conv-neural-network

Вопрос:

Я пытаюсь выполнить распознавание действий в K-м наборе данных с 6 классами. Модель, которую я использую, — Keras convo3d. Я вроде как новичок в этом, поэтому не могу понять, в чем я ошибся. Вся предварительная обработка работает нормально, но у модели возникают проблемы. кто-нибудь может мне помочь, пожалуйста

это что-то в форме, чего я не понимаю

вот код

 
(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])
 

Количество образцов : 599
Форма X_Train: (599, 16, 16, 15)

(599, 1, 16, 16, 15) образцы поездов

форма ввода является : (1, 16, 16, 15)

вот в чем ошибка

 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:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasenginetraining.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasenginetraining.py", line 1098, in fit
    tmp_logs = train_function(iterator)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythoneagerdef_function.py", line 780, in __call__
    result = self._call(*args, **kwds)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythoneagerdef_function.py", line 823, in _call
    self._initialize(args, kwds, add_initializers_to=initializers)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythoneagerdef_function.py", line 696, in _initialize
    self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythoneagerfunction.py", line 2855, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythoneagerfunction.py", line 3213, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythoneagerfunction.py", line 3065, in _create_graph_function
    func_graph_module.func_graph_from_py_func(
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonframeworkfunc_graph.py", line 986, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythoneagerdef_function.py", line 600, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonframeworkfunc_graph.py", line 973, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasenginetraining.py:806 train_function  *
        return step_function(self, iterator)
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasenginetraining.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythondistributedistribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythondistributedistribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythondistributedistribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasenginetraining.py:789 run_step  **
        outputs = model.train_step(data)
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasenginetraining.py:747 train_step
        y_pred = self(x, training=True)
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasenginebase_layer.py:975 __call__
        input_spec.assert_input_compatibility(self.input_spec, inputs,
    C:Usersprobook 430miniconda3envsKTHCondaCNNlibsite-packagestensorflowpythonkerasengineinput_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:

Форма ввода ваших изображений должна быть (batch_size, height, width, depth, channels) (см. Документы), поэтому кажется, что в вашем образце X_train отсутствует измерение каналов.

Ниже вы можете видеть, что модель работает с правильными входными размерами. Обратите внимание, что первый 1 дюйм X необходим для учета размера пакета, а последний-для количества каналов.

 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)>
 

Комментарии:

1. Я задал форму ввода, например (1,16,16,15,1), но теперь она выдает другое значение ошибки Ошибка: Ввод 0 слоя max_pooling3d несовместим со слоем: ожидаемый ndim=5, найденный ndim=6. Полная форма получена: [Нет, 1, 12, 12, 11, 2]

2. Извините, наверное, я плохо выразился. Соответствие между вашим образцом поезда и ожидаемыми входными данными должно быть (599, 16, 16, 15, 1) — > (размер партии, высота, ширина, каналы) и не (599, 1, 16, 16, 15, 1).

3. Я думаю, что сейчас я делаю здесь неправильно «train_set = np.нули((num_samples, 1, img_rows, img_cols , img_depth))» Я преобразовал его в ((num_samples, строки, столбцы, глубина, 1)) формат, но теперь я не понимаю, как транслировать его, как этот код выдает ошибку сейчас » для h в диапазоне(num_samples): train_set[h][0][:][:][:] = X_train[h, :, :, :] »

4. Если все, что было раньше model.fit , в порядке, вы можете попробовать просто изменить форму входного образца. X_train = X_train.reshape(599, 16, 16, 15, 1)