极低的损耗与CRNN使用Keras时相同

2024-04-25 13:46:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着和Keras一起开发CRNN。但是在训练网络时,我的损失在大约两次迭代后保持不变,而且非常低!这不可能是对的,但我不知道我的错误,所以我想向你们展示我的模型和我的训练,希望你们能帮助我解决这个问题。你知道吗

这就是奇怪的损失:

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规格的形状为(19、128、128)。你知道吗

我使用tensorflow gpu版本1.5.1和Keras版本2.1.6


Tags: testaddsizemodelbatchtrainkerneldropout
1条回答
网友
1楼 · 发布于 2024-04-25 13:46:08

在最后一个softmax层之后添加一个dropout层实质上是将输出层归零,使你的dropout百分比有效地降低了你出错的几率,即使给出了一个完美的模型!这也意味着最终输出通常不会像softmax层的输出那样模拟概率分布(即总和为1),这意味着应用分类交叉熵(依赖于输入是概率分布)会产生非常奇怪的结果(比如0,当它们不应该是)

相关问题 更多 >