Я пытаюсь разработать CRNN с Keras.Но при обучении сети мои потери остаются такими же примерно после двух итераций и, кроме того, чрезвычайно низки!Это не может быть правдой, но я не знаю своей ошибки, поэтому я хочу показать вам свою модель и мои тренировки и надеюсь, что вы, ребята, можете помочь мне с этим вопросом.
Это страннопотеря:
1. Iteration:
Train: Loss: 4.596062183380127 accuracy: 0.34375
2. Iteration:
Train: Loss: 1.1920930376163597e-07 accuracy: 0.453125
3. Iteration:
Train: Loss: 1.1920930376163597e-07 accuracy: 0.53125
4. Iteration:
Train: Loss: 1.1920930376163597e-07 accuracy: 0.5625
5. Iteration:
Train: Loss: 1.1920930376163597e-07 accuracy: 0.484375
Это моя модель:
cnn_dropout = 0.3
rnn_dropout = 0.3
learning_rate = 0.001
n_units = 256
batch_size = 64
steps = 1000
strides = 3
kernel_size = 3
num_classes = 4
model = Sequential()
# CNN 2D
model.add(Convolution2D(n_units, strides=strides, kernel_size=kernel_size, batch_size=batch_size, input_shape=input_shape, padding='SAME', data_format='channels_first'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Convolution2D(n_units, strides=strides, kernel_size=kernel_size, padding='SAME'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Dropout(cnn_dropout))
model.add(Reshape((n_units, -1)))
model.add(LSTM(n_units, input_shape=(256, 147), return_sequences=True, go_backwards=True))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(rnn_dropout))
model.add(Flatten())
model.add(Dense(100))
model.add(Activation('relu'))
model.add(Dense(4))
model.add(Activation('softmax'))
model.add(Dropout(cnn_dropout))
opt = keras.optimizers.adam(lr=learning_rate)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
Это мой тренировочный этап:
# Training the model
for n in range(1, steps):
print("{}. Iteration:".format(n))
x_train_batch, y_train_batch = next_batch(batch_size, train_feature_paths, train_labels_f0)
score = model.train_on_batch(x_train_batch, y_train_batch)
print("Train: Loss: {} accuracy: {}".format(score[0], score[1]))
# Test every 20 iterations
if n % 100 == 0:
x_test_batch, y_test_batch = next_batch(batch_size, test_feature_paths, test_labels_f0)
score = model.test_on_batch(x_test_batch, y_test_batch)
print("Test: Loss: {} accuracy: {}".format(score[0], score[1]))
Если вам нужно знать, мои входные данные представляют собой mel-спектрограммы, которые были заранее извлечены и сохранены в виде * .npy-файлов.Форма сохраненных mel-spec'ов: (19, 128, 128).
Я использую tenorflow-gpu версии 1.5.1 и Keras версии 2.1.6