Почему мой прогноз не верен, хотя у меня высокая точность и высокая точность проверки? - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь разработать модель, которую можно было бы распознать по аудиофайлу, если слово триггера («привет») встречается во времени.Я использовал некоторые идеи из курса Н.Г. Эндрю из 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, а также оценивал результат с примерами из обучающего набора, и он был все тот же, так что я не думаю, что этопроблема с переоснащением.

Есть идеи как это исправить?Заранее спасибо:)

...