我正在嘗試對我的和其他人的聲音進行分類,然后將其應用于未來的程式。我為此使用了 CNN 模型,在訓練中它給出了非常好的結果,我將音頻轉換為頻譜圖以供 CNN 理解。問題出在預測中,我將音頻轉換為頻譜圖也是如此,但它給了我這個錯誤。
ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 129, 1071, 1), found shape=(None, 1071)
在模型中我放了這個并且沒有給出錯誤
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(129, 1071, 1)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
這是我的預測代碼
### VOICE CLASSIFICATION ###
voice_model = load_model(os.path.abspath('Models/voiceclassify2.model'))
classes = ['Other', 'Bernardo']
sample = os.path.abspath('Voiceclassification/Data/me/5.wav')
samplerate, data = wavfile.read(str(sample))
# convert into spectogram
frecuencies, times, spectogram = signal.spectrogram(data, samplerate)
vc_prediction = voice_model.predict(spectogram)[0]
idx = np.argmax(vc_prediction)
label = classes[idx]
print(label, " | ", vc_prediction[idx]*100, "%")
任何的想法?
uj5u.com熱心網友回復:
編輯:
經過一番擺弄,這是解決方案:一方面,輸入的最終尺寸(1在 input_shape 中)存在錯誤。這表示通道數(想想影像中的 RGB 通道)。為了擴展我們的頻譜圖,我們可以使用
spectrogram = spectrogram.reshape(spectrogram.shape (1,)) 或者
spectrogram = np.expand_dims(spectrogram, -1).
此時頻譜圖的形狀將是 (129, 1071, 1)。
另一方面,在推理程序中,第一個維度 (129) 被洗掉,因為 TensorFlow 會將其解釋為批次維度。您可以通過將頻譜圖包裝在一個(一個元素)NumPy 陣列中來解決這個問題,如下所示:
spectrogram = np.array([spectrogram])
現在頻譜圖的形狀是 (1, 129, 1071, 1),這正是我們所需要的。
原來的:
這絕對是評論而不是答案,但由于缺乏聲譽,我無法寫這些,所以請隨時將其移至評論...
所以問題是預期的形狀(以及你的網路架構)和你的資料的形狀不匹配。我猜這是因為 predict() 呼叫希望您交出一批樣本(查看每個形狀的第一個維度)以進行評估。您可以通過使用 list: 將 spectrogram 引數包裝在 predict 呼叫中來解決此問題vc_prediction = voice_model.predict([spectogram])[0]。如果這不能解決我建議進一步研究訓練和評估資料的形狀的技巧,我喜歡在運行時以除錯模式執行此操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/408855.html
標籤:
