Я пытаюсь разработать модель, которую можно было бы распознать по аудиофайлу, если слово триггера («привет») встречается во времени.Я использовал некоторые идеи из курса Н.Г. Эндрю из Coursera, но в моем случае что-то не работает.
Я построил модель:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 3937, 129) 0
_________________________________________________________________
conv1d_1 (Conv1D) (None, 981, 196) 379456
_________________________________________________________________
batch_normalization_1 (Batch (None, 981, 196) 784
_________________________________________________________________
activation_1 (Activation) (None, 981, 196) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 981, 196) 0
_________________________________________________________________
gru_1 (GRU) (None, 981, 128) 124800
_________________________________________________________________
dropout_2 (Dropout) (None, 981, 128) 0
_________________________________________________________________
batch_normalization_2 (Batch (None, 981, 128) 512
_________________________________________________________________
gru_2 (GRU) (None, 981, 128) 98688
_________________________________________________________________
dropout_3 (Dropout) (None, 981, 128) 0
_________________________________________________________________
batch_normalization_3 (Batch (None, 981, 128) 512
_________________________________________________________________
dropout_4 (Dropout) (None, 981, 128) 0
_________________________________________________________________
time_distributed_1 (TimeDist (None, 981, 1) 129
=================================================================
Total params: 604,881
Trainable params: 603,977
Non-trainable params: 904
_________________________________________________________________
Я сам создал набор данных с 3937 примерами и преобразовал каждый аудиофайл в его спектрограмму, поэтому:
Входные данные - спектрограмма аудиофайла,
Выходные данные - вектор времени со значениями от 0 до 1.
Вектор времени изначально имеет 10000 временных меток, но для возможности подгонки к модели яоцифровывал его, так что в итоге у него 981 отметка времени.
Для обучения я использовал этот фрагмент кода:
opt = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.01)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=["accuracy"])
mcp_save = ModelCheckpoint('model-{epoch:03d}-{acc:03f}-{val_acc:03f}.h5', save_best_only=True, monitor='val_loss', mode='auto')
model.fit(X, Y, batch_size=8, epochs=150, validation_split=0.2, callbacks=[mcp_save])
Как я мог видеть, точность увеличивалась в первые 25 эпох и достигала около 90%.После этого он застрял - акк не сильно изменилась, так что потеря.Когда появлялся val_acc, он был равен 99%.
Я прекратил тренировки после 40-й эпохи и попытался проверить это на примере, которого модель не видела раньше.Вектор Y (метка) для этого примера должен быть:
https://imgur.com/C8jg5kD.jpg
, и я получил результат:
https://imgur.com/vxPWcWq.jpg
В этом случаеаудиофайл содержит 4 слова, но только одно из них является триггерным (второе).
Я не совсем понимаю, почему моя модель дает мне результат со значениями 0 - 0,4.Я пробовал другие примеры, и это было то же самое.Более того, я хотел бы знать, как инвертировать результат, поэтому он должен иметь самые высокие значения после прослушивания слова триггера, а не самые низкие.И последнее, но не менее важное: что я могу сделать, чтобы научить модель распознавать это определенное слово?
Я также должен упомянуть, что я пытался тренировать модель с большим batch_size, ReduceLROnPlateau, а также оценивал результат с примерами из обучающего набора, и он был все тот же, так что я не думаю, что этопроблема с переоснащением.
Есть идеи как это исправить?Заранее спасибо:)