(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% при проверке, может ли кто-нибудь подсказать мне, как решить эту проблему?

0 ответов

Другие вопросы по тегам