У меня есть набор видео для классификации слов. Набор данных состоит из 137 638 обучающих видео, 42 000 проверочных видео и 18 000 проверочных видео. Каждое видео имеет разное количество кадров, в то время как все кадры имеют одинаковый размер (40x62x1). Количество классов - 51. Приведенный ниже код использует CNN для извлечения признаков и LSTM для классификации. Но когда я попытался обучить модель, появилась следующая ошибка ValueError: input tensor must have rank 4
, хотя input_shape = (n_frames, frame_width, frame_height, n_channels) , как показано в коде.
Может ли кто-нибудь помочь мне?
Мой код:
import tensorflow as tf
import numpy as np
import time
import os
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import TimeDistributed
from keras.layers import Conv2D
from keras.layers import MaxPool2D
from keras.layers import Flatten
from keras.layers import Dense,Bidirectional
from keras.layers.recurrent import LSTM
start = time.time()
nb_classes = 51
# loading data
TRAIN_PATH = "E:/PhD/Video/Train"
VAL_PATH = "E:/PhD/Video/Validation"
TEST_PATH = "E:/PhD/Video/Test"
X_train = np.load(os.path.join(TRAIN_PATH,'Train.npy'))
X_val = np.load(os.path.join(VAL_PATH,'Validation.npy'))
X_test = np.load(os.path.join(TEST_PATH,'Test.npy'))
# loading labels
Y_train = np.load(os.path.join(TRAIN_PATH,'Train_labels_binary.npy'))
Y_val = np.load(os.path.join(VAL_PATH,'Validation_labels_binary.npy'))
Y_test = np.load(os.path.join(TEST_PATH,'Test_labels_binary.npy'))
print(len(X_train), 'train sequences')
print(len(X_val), 'validation sequences')
print(len(X_test), 'test sequences')
print('X_train shape:', X_train.shape)
print('X_val shape:', X_val.shape)
print('X_test shape:', X_test.shape)
print('y_train shape:', Y_train.shape)
print('y_val shape:', Y_val.shape)
print('y_test shape:', Y_test.shape)
print('Build model...')
#Model Design
model = tf.keras.models.Sequential([
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(32, (3,3), strides=(1,1), activation='relu',
kernel_initializer='uniform',
bias_initializer='one',
input_shape = (X_train.shape[0], 40, 62, 1),
data_format='channels_last')),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPool2D(pool_size=(2, 2))),
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(32,(3,3), activation = 'relu')),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPool2D(pool_size=(2, 2))),
tf.keras.layers.TimeDistributed(tf.keras.layers.Flatten()),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(2000, kernel_initializer ='uniform',
recurrent_initializer='uniform',
bias_initializer='one', activation='tanh',
recurrent_activation='sigmoid', return_sequences=True)),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(2000, kernel_initializer ='uniform',
recurrent_initializer='uniform',bias_initializer='one',
activation='tanh', recurrent_activation='sigmoid')),
tf.keras.layers.Dense(nb_classes, activation = 'softmax')
])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
hist = model.fit(X_train, Y_train, validation_data=(X_val, Y_val), epochs=50,
batch_size=64, verbose=1)
# Final evaluation of the model
scores = model.evaluate(X_test, Y_test, verbose=1)
Y_pred = model.predict(X_test)
Ошибка:
Traceback (most recent call last):
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\framework\tensor_shape.py", line 928, in merge_with
self.assert_same_rank(other)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\framework\tensor_shape.py", line 983, in assert_same_rank
(self, other))
ValueError: Shapes (None, 62) and (None, None, None, None) must have the same rank
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\framework\tensor_shape.py", line 1013, in with_rank
return self.merge_with(unknown_shape(rank=rank))
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\framework\tensor_shape.py", line 934, in merge_with
raise ValueError("Shapes %s and %s are not compatible" % (self, other))
ValueError: Shapes (None, 62) and (None, None, None, None) are not compatible
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\ops\nn_ops.py", line 1064, in __init__
input_shape.with_rank(num_spatial_dims + 2)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\framework\tensor_shape.py", line 1015, in with_rank
raise ValueError("Shape %s must have rank %d" % (self, rank))
ValueError: Shape (None, 62) must have rank 4
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<ipython-input-4-2ac41977fbc6>", line 1, in <module>
runfile('E:/PhD/Video/CNN+LSTM/CNN+LSTM.py', wdir='E:/PhD/Video/CNN+LSTM')
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "E:/PhD/Video/CNN+LSTM/CNN+LSTM.py", line 77, in <module>
batch_size=64, verbose=1)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 728, in fit
use_multiprocessing=use_multiprocessing)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 224, in fit
distribution_strategy=strategy)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 547, in _process_training_inputs
use_multiprocessing=use_multiprocessing)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 594, in _process_inputs
steps=steps)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2419, in _standardize_user_data
all_inputs, y_input, dict_inputs = self._build_model_with_inputs(x, y)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2622, in _build_model_with_inputs
self._set_inputs(cast_inputs)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2709, in _set_inputs
outputs = self(inputs, **kwargs)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 842, in __call__
outputs = call_fn(cast_inputs, *args, **kwargs)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\sequential.py", line 270, in call
outputs = layer(inputs, **kwargs)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 817, in __call__
self._maybe_build(inputs)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 2141, in _maybe_build
self.build(input_shapes)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\layers\wrappers.py", line 203, in build
super(TimeDistributed, self).build(tuple(child_input_shape))
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\layers\wrappers.py", line 61, in build
self.layer.build(input_shape)
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\keras\layers\convolutional.py", line 193, in build
self.rank + 2))
File "C:\Users\hms08\AppData\Local\Continuum\anaconda3\envs\keras-gpu\lib\site-packages\tensorflow_core\python\ops\nn_ops.py", line 1067, in __init__
"input tensor must have rank %d" % (num_spatial_dims + 2))
ValueError: input tensor must have rank 4