(TensorFlow) Слой TimeDistributed для классификации изображений
Я знаю, что слои "Распределенные по времени" используются, когда у нас есть несколько изображений, которые упорядочены в хронологическом порядке для обнаружения движений, действий, направлений и т. Д. Однако я работаю над классификацией речи с помощью спектрограмм. Каждая речь преобразуется в спектрограмму, которая позже будет передана в нейронную сеть для выполнения классификации. Итак, моя база данных представлена в виде 2093 изображений RGB (100x100x3). На данный момент я использовал CNN, и на входе
x_train = np.array(x_train).reshape(2093,100,100, 3)
И все работает отлично.
Но теперь я хотел бы использовать CNN+BLSTM (аналогично следующей картинке, взятой из этой статьи), а это значит, что мне потребуются временные шаги. Итак, каждое изображение следует разделить на более мелкие кадры.
Вопрос в том, как подготовить данные для этого?
Предполагая, что я хочу разделить каждое изображение на 10 кадров (временных шагов). Должен ли я просто изменить форму данных
x_train = np.array(x_train).reshape(2093,10,10,100, 3)
Что работает нормально, но я не уверен, правильно ли это, или есть другой способ сделать это?
Это модель, которую я использую
model = tf.keras.Sequential([
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(100,100,3),name="conv1")),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPooling2D(pool_size=2)),
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(filters=128, kernel_size=2, padding='same', activation='relu')),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPooling2D(pool_size=2)),
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(filters=256, kernel_size=2, padding='same', activation='relu')),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPooling2D(pool_size=2)),
tf.keras.layers.TimeDistributed(tf.keras.layers.Flatten()),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(200, activation="relu"),
tf.keras.layers.Dense(10, activation= "softmax")
])
Используя предыдущую модель, я получил 47% точности поезда и 46% точности проверки, но с использованием только CNN я получил 95% на поезде и 71% при проверке, может ли кто-нибудь подсказать мне, как решить эту проблему?