Чрезвычайно низкие потери остаются неизменными при использовании Keras для CRNN - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь разработать 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

1 Ответ

0 голосов
/ 20 мая 2018

Добавление выпадающего слоя после финального слоя softmax практически обнуляет выходной слой, делая эффективный процент выпадения процентным шансом, что вы ошибетесь, даже при наличии идеальной модели!Это также означает, что конечный результат часто не будет моделировать распределение вероятностей (то есть сумму к 1), как выходной сигнал софтмакс-слоя, что означает, что применение категориальной кроссцентропии (которая зависит от того, является ли входом распределение вероятностей) даст очень странные результаты(например, 0, когда их не должно быть)

...