在终端中运行Python并获取ValueError
试图从终端运行此python代码,但我收到此错误。现在发生的事情是,我正试图找到/使用一种方法,利用librosa库根据谱图对音乐进行分类 $python3 get\u genre.py../test.mp3在终端中运行Python并获取ValueError,python,python-3.x,terminal,librosa,Python,Python 3.x,Terminal,Librosa,试图从终端运行此python代码,但我收到此错误。现在发生的事情是,我正试图找到/使用一种方法,利用librosa库根据谱图对音乐进行分类 $python3 get\u genre.py../test.mp3 Traceback (most recent call last): File "get_genre.py", line 61, in <module> main(sys.argv[1:]) File "get_genre.py", line 50, in ma
Traceback (most recent call last):
File "get_genre.py", line 61, in <module>
main(sys.argv[1:])
File "get_genre.py", line 50, in main
pred_genre = le.inverse_transform(pred_index)
File "/Users/nico/opt/anaconda3/lib/python3.7/site-packages/sklearn/preprocessing/label.py", line 273, in inverse_transform
y = column_or_1d(y, warn=True)
File "/Users/nico/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py", line 760, in column_or_1d
raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape ()
由于代码对我有效,我可以查明
ValueError
的原因
Python抛出该错误是因为该文件不存在,这意味着您的程序没有从父目录读取的访问权限
将test.mp3
复制到src
目录中,然后运行python3 get\u genre.py test.mp3
,它就会工作
import numpy as np
import torch
import sys
from collections import Counter
from sklearn.preprocessing import LabelEncoder
from librosa.core import load
from librosa.feature import melspectrogram
from librosa import power_to_db
from model import genreNet
from config import MODELPATH
from config import GENRES
import warnings
warnings.filterwarnings("ignore")
def main(argv):
if len(argv) != 1:
print("Usage: python3 get_genre.py audiopath")
exit()
le = LabelEncoder().fit(GENRES)
# ------------------------------- #
## LOAD TRAINED GENRENET MODEL
net = genreNet()
net.load_state_dict(torch.load(MODELPATH, map_location='cpu'))
# ------------------------------- #
## LOAD AUDIO
audio_path = argv[0]
y, sr = load(audio_path, mono=True, sr=22050)
# ------------------------------- #
## GET CHUNKS OF AUDIO SPECTROGRAMS
S = melspectrogram(y, sr).T
S = S[:-1 * (S.shape[0] % 128)]
num_chunk = S.shape[0] / 128
data_chunks = np.split(S, num_chunk)
# ------------------------------- #
## CLASSIFY SPECTROGRAMS
genres = list()
for i, data in enumerate(data_chunks):
data = torch.FloatTensor(data).view(1, 1, 128, 128)
preds = net(data)
pred_val, pred_index = preds.max(1)
pred_index = pred_index.data.numpy()[0]
pred_val = np.exp(pred_val.data.numpy()[0])
pred_genre = le.inverse_transform(pred_index)
if pred_val >= 0.5:
genres.append(pred_genre)
# ------------------------------- #
s = float(sum([v for k,v in dict(Counter(genres)).items()]))
pos_genre = sorted([(k, v/s*100 ) for k,v in dict(Counter(genres)).items()], key=lambda x:x[1], reverse=True)
for genre, pos in pos_genre:
print("%10s: \t%.2f\t%%" % (genre, pos))
return
if __name__ == '__main__':
main(sys.argv[1:])