【问题标题】:sklearn.exceptions.NotFittedError: This LabelEncoder instance is not fitted yetsklearn.exceptions.NotFittedError:此 LabelEncoder 实例尚未安装
【发布时间】:2020-10-30 15:58:16
【问题描述】:

我正在尝试从 Github HERE 运行语音识别代码来分析语音。 final_results_gender_test.ipynb 中有一个示例说明了训练和推理的步骤。因此,我复制并调整了推理部分,并提出了以下代码,该代码使用经过训练的模型进行推理。但我不知道为什么会出现这个错误,抱怨This LabelEncoder instance is not fitted yet

如何解决问题?我只是在做推理,为什么我需要适合?

Traceback (most recent call last):
  File "C:\Users\myname\Documents\Speech-Emotion-Analyzer-master\audio.py", line 53, in <module>
    livepredictions = (lb.inverse_transform((liveabc)))
  File "C:\Users\myname\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 272, in inverse_transform
    check_is_fitted(self, 'classes_')
  File "C:\Users\myname\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py", line 914, in check_is_fitted
    raise NotFittedError(msg % {'name': type(estimator).__name__})
sklearn.exceptions.NotFittedError: This LabelEncoder instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

这是我从笔记本中复制/调整的代码:

import os
from keras import regularizers
import keras
from keras.callbacks import ModelCheckpoint
from keras.layers import Conv1D, MaxPooling1D, AveragePooling1D, Dense, Embedding, Input, Flatten, Dropout, Activation, LSTM
from keras.models import Model, Sequential, model_from_json
from keras.preprocessing import sequence
from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer
from keras.utils import to_categorical
import librosa
import librosa.display
from matplotlib.pyplot import specgram
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf

opt = keras.optimizers.rmsprop(lr=0.00001, decay=1e-6)
lb = LabelEncoder()

json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights("saved_models/Emotion_Voice_Detection_Model.h5")
print("Loaded model from disk")
 
X, sample_rate = librosa.load('h04.wav', res_type='kaiser_fast',duration=2.5,sr=22050*2,offset=0.5)
sample_rate = np.array(sample_rate)
mfccs = np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=13),axis=0)
featurelive = mfccs
livedf2 = featurelive
livedf2= pd.DataFrame(data=livedf2)
livedf2 = livedf2.stack().to_frame().T
twodim= np.expand_dims(livedf2, axis=2)
livepreds = loaded_model.predict(twodim, batch_size=32, verbose=1)

livepreds1=livepreds.argmax(axis=1)
liveabc = livepreds1.astype(int).flatten()
livepredictions = (lb.inverse_transform((liveabc)))
print(livepredictions)

【问题讨论】:

标签: python keras voice-recognition speech-recognition scikit-learn


【解决方案1】:

我也遇到了同样的问题。对你来说可能为时已晚。但是我想为仍然有错误的人提供解决方案。

我正在使用此代码Github

在 read.me 文件中,您可以看到以下注释: 注意:如果您直接使用模型并且想要解码从 0 到 9 的输出,那么以下列表将对您有所帮助。

既然他已经给出了那个列表,那就从你的代码中删除这部分:

livepredictions = (lb.inverse_transform((liveabc)))
print(livepredictions)

由于语音已经加载,我们不需要对其进行拟合或转换。

所以不要添加这些行:我更喜欢用作字典,然后从那里打印出来。

Sentiments = { 0 : "Female_angry",
               1 : "Female Calm",
               2 : "Female Fearful",
               3 : "Female Happy",
               4 : "Female Sad",
               5 : "Male Angry",
               6 : "Male calm",
               7 : "Male Fearful",
               8 : "Male Happy",
               9 : "Male sad"
}

方式1:使用生成器从字典中获取值。

Result = [emotions for (number,emotions) in Sentiments.items() if liveabc == number]
print(Result)

方式2:或者直接从字典中获取准确值。

for number,emotions in Sentiments.items():
     if liveabc == number:
         print(emotions)

如果您使用方式 1:它会显示为 ['Male Angry']。 如果您使用方式 2:它将打印为 Male Angry。

所以完整的代码会是这样的:

from keras.models import model_from_json
import librosa
import numpy as np
import pandas as pd


    Sentiments = { 0 : "Female_angry",
                   1 : "Female Calm",
                   2 : "Female Fearful",
                   3 : "Female Happy",
                   4 : "Female Sad",
                   5 : "Male Angry",
                   6 : "Male calm",
                   7 : "Male Fearful",
                   8 : "Male Happy",
                   9 : "Male sad"
    }
    
    json_file = open('model.json', 'r')
    loaded_model_json = json_file.read()
    json_file.close()
    loaded_model = model_from_json(loaded_model_json)
    # load weights into new model
    loaded_model.load_weights("saved_models/Emotion_Voice_Detection_Model.h5")
    print("Loaded model from disk")
    
    
    X, sample_rate = librosa.load('output10.wav', res_type='kaiser_fast',duration=2.5,sr=22050*2,offset=0.5)
    sample_rate = np.array(sample_rate)
    mfccs = np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=13),axis=0)
    featurelive = mfccs
    livedf2 = featurelive
    livedf2= pd.DataFrame(data=livedf2)
    livedf2 = livedf2.stack().to_frame().T
    twodim= np.expand_dims(livedf2, axis=2)
    livepreds = loaded_model.predict(twodim, 
                             batch_size=32, 
                             verbose=1)
    livepreds1=livepreds.argmax(axis=1)
    liveabc = livepreds1.astype(int).flatten()
    
    
    Result = [emotions for (number,emotions) in Sentiments.items() if liveabc == number]
    print(Result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2018-08-31
    • 2019-03-10
    • 2019-12-13
    • 2021-08-28
    • 2019-05-06
    • 2019-10-05
    相关资源
    最近更新 更多