是什么导致此 LSTM 的精度如此低?
What is causing such low accuracy for this LSTM?
我正在创建一个音乐键识别算法。我有大约 50000 首曲目。每个轨道都表示为音高列表(1 到 12)。由于我想将每个音高序列分类为 24 个类别之一(关键),我想我会像对待文本分类问题一样对待它。我在网上复制了一个示例,使用的是单层 LSTM 网络。然而,准确性非常低(大约 3%)。由于我是机器学习的新手,我将非常感谢任何有关如何构建适用于该问题的 LSTM 的直觉。
# Create Embedding (Input) Layer (max_words) --> LSTM Layer (128)
model.add(Embedding(possible_notes+1,5,mask_zero = True))
model.add(LSTM(5, dropout=0.2, recurrent_dropout=0.2))
# LSTM Layer (128) --> Output Layer (num_classes)
model.add(Dense(num_classes, activation='softmax'))
# Add optimization method, loss function and optimization value
model.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
# "Fit the model" (train model), using training data (80% of dataset)
model.fit(X_train, Y_train, batch_size=batch_size,
epochs=num_epochs, validation_data=(X_val, Y_val))
这是我得到的输出示例:
INFO 2019-07-20 18:45:38 +0200 master-replica-0 34000/42666 [======================>.......] - ETA: 16s - loss: 76.2733 - acc: 2.9412e-05
INFO 2019-07-20 18:45:40 +0200 master-replica-0 35000/42666 [=======================>......] - ETA: 14s - loss: 76.2733 - acc: 2.8571e-05
INFO 2019-07-20 18:45:42 +0200 master-replica-0 36000/42666 [========================>.....] - ETA: 13s - loss: 76.2733 - acc: 2.7778e-05
INFO 2019-07-20 18:45:44 +0200 master-replica-0 37000/42666 [=========================>....] - ETA: 11s - loss: 76.2733 - acc: 2.7027e-05
INFO 2019-07-20 18:45:46 +0200 master-replica-0 38000/42666 [=========================>....] - ETA: 9s - loss: 76.2733 - acc: 2.6316e-05
INFO 2019-07-20 18:45:48 +0200 master-replica-0 39000/42666 [==========================>...] - ETA: 7s - loss: 76.2733 - acc: 2.5641e-05
INFO 2019-07-20 18:45:50 +0200 master-replica-0 40000/42666 [===========================>..] - ETA: 5s - loss: 76.2733 - acc: 2.5000e-05
INFO 2019-07-20 18:45:52 +0200 master-replica-0 41000/42666 [===========================>..] - ETA: 3s - loss: 76.2733 - acc: 2.4390e-05
INFO 2019-07-20 18:45:57 +0200 master-replica-0 42000/42666 [============================>.] - ETA: 1s - loss: 76.2733 - acc: 2.3810e-05
INFO 2019-07-20 18:45:57 +0200 master-replica-0 42666/42666 [==============================] - 87s 2ms/step - loss: 76.2733 - acc: 2.3438e-05 - val_loss: 76.2733 - val_acc: 0.0000e+00
我在 Google Cloud Platform 上 运行 使用 basic_gpu 设置安装此模型。
这是命令我运行:
gcloud ai-platform jobs submit training $JOB_NAME \
--scale-tier BASIC_GPU \
--job-dir $OUTPUT_PATH \
--module-name trainer.task \
--package-path trainer/ \
--region $REGION \
--python-version 3.5 \
--runtime-version 1.4 \
-- \
--train-file gs://dissertation-models/Data/complete_dataset.csv \
--num-epochs 3 \
--batch-size 64
我尝试了不同的批量大小和轮数,总是给出相同的损失和类似的低精度。
您只是没有训练足够多的 epoch。 50,000 个样本需要 3 个以上的 epoch。而且你的 LSTM 网络太简单了。
另外,我建议在 LSTM 上使用 transformer 模型。通常为 voice/speech 数据提供更好的准确性。
我正在创建一个音乐键识别算法。我有大约 50000 首曲目。每个轨道都表示为音高列表(1 到 12)。由于我想将每个音高序列分类为 24 个类别之一(关键),我想我会像对待文本分类问题一样对待它。我在网上复制了一个示例,使用的是单层 LSTM 网络。然而,准确性非常低(大约 3%)。由于我是机器学习的新手,我将非常感谢任何有关如何构建适用于该问题的 LSTM 的直觉。
# Create Embedding (Input) Layer (max_words) --> LSTM Layer (128)
model.add(Embedding(possible_notes+1,5,mask_zero = True))
model.add(LSTM(5, dropout=0.2, recurrent_dropout=0.2))
# LSTM Layer (128) --> Output Layer (num_classes)
model.add(Dense(num_classes, activation='softmax'))
# Add optimization method, loss function and optimization value
model.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
# "Fit the model" (train model), using training data (80% of dataset)
model.fit(X_train, Y_train, batch_size=batch_size,
epochs=num_epochs, validation_data=(X_val, Y_val))
这是我得到的输出示例:
INFO 2019-07-20 18:45:38 +0200 master-replica-0 34000/42666 [======================>.......] - ETA: 16s - loss: 76.2733 - acc: 2.9412e-05
INFO 2019-07-20 18:45:40 +0200 master-replica-0 35000/42666 [=======================>......] - ETA: 14s - loss: 76.2733 - acc: 2.8571e-05
INFO 2019-07-20 18:45:42 +0200 master-replica-0 36000/42666 [========================>.....] - ETA: 13s - loss: 76.2733 - acc: 2.7778e-05
INFO 2019-07-20 18:45:44 +0200 master-replica-0 37000/42666 [=========================>....] - ETA: 11s - loss: 76.2733 - acc: 2.7027e-05
INFO 2019-07-20 18:45:46 +0200 master-replica-0 38000/42666 [=========================>....] - ETA: 9s - loss: 76.2733 - acc: 2.6316e-05
INFO 2019-07-20 18:45:48 +0200 master-replica-0 39000/42666 [==========================>...] - ETA: 7s - loss: 76.2733 - acc: 2.5641e-05
INFO 2019-07-20 18:45:50 +0200 master-replica-0 40000/42666 [===========================>..] - ETA: 5s - loss: 76.2733 - acc: 2.5000e-05
INFO 2019-07-20 18:45:52 +0200 master-replica-0 41000/42666 [===========================>..] - ETA: 3s - loss: 76.2733 - acc: 2.4390e-05
INFO 2019-07-20 18:45:57 +0200 master-replica-0 42000/42666 [============================>.] - ETA: 1s - loss: 76.2733 - acc: 2.3810e-05
INFO 2019-07-20 18:45:57 +0200 master-replica-0 42666/42666 [==============================] - 87s 2ms/step - loss: 76.2733 - acc: 2.3438e-05 - val_loss: 76.2733 - val_acc: 0.0000e+00
我在 Google Cloud Platform 上 运行 使用 basic_gpu 设置安装此模型。
这是命令我运行:
gcloud ai-platform jobs submit training $JOB_NAME \
--scale-tier BASIC_GPU \
--job-dir $OUTPUT_PATH \
--module-name trainer.task \
--package-path trainer/ \
--region $REGION \
--python-version 3.5 \
--runtime-version 1.4 \
-- \
--train-file gs://dissertation-models/Data/complete_dataset.csv \
--num-epochs 3 \
--batch-size 64
我尝试了不同的批量大小和轮数,总是给出相同的损失和类似的低精度。
您只是没有训练足够多的 epoch。 50,000 个样本需要 3 个以上的 epoch。而且你的 LSTM 网络太简单了。
另外,我建议在 LSTM 上使用 transformer 模型。通常为 voice/speech 数据提供更好的准确性。