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