【问题标题】:Expected dense_3_input to have shape (None, 40) but got array with shape (40, 1)预期 dense_3_input 具有形状 (None, 40) 但得到的数组具有形状 (40, 1)
【发布时间】:2018-01-16 12:40:32
【问题描述】:

我是深度学习的初学者,正在尝试通过对数据集执行音频分析来练习在 Python 中实现神经网络。我一直在关注Urban Sound Challenge 教程并完成了训练模型的代码,但是在尝试在测试集上运行模型时一直遇到错误。

这是我创建模型和训练的代码:

import numpy as np
from sklearn.preprocessing import LabelEncoder
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten

num_labels = y.shape[1]
filter_size = 2

model = Sequential()

model.add(Dense(256, input_shape = (40,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_labels))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
model.fit(X, y, batch_size=32, epochs=40, validation_data=(val_X, val_Y))

在拟合模型之前运行 model.summary() 给了我:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_3 (Dense)              (None, 256)               10496     
_________________________________________________________________
activation_3 (Activation)    (None, 256)               0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 10)                2570      
_________________________________________________________________
activation_4 (Activation)    (None, 10)                0         
=================================================================
Total params: 13,066
Trainable params: 13,066
Non-trainable params: 0
_________________________________________________________________

拟合模型后,我尝试在一个文件上运行它,以便它可以对声音进行分类。

file_name = ".../UrbanSoundClassifier/test/Test/5.wav"
test_X, sample_rate = librosa.load(file_name,res_type='kaiser_fast')
mfccs = np.mean(librosa.feature.mfcc(y=test_X, sr=sample_rate, n_mfcc=40).T,axis=0)
test_X = np.array(mfccs)
print(model.predict(test_X))

但是,我明白了

ValueError: Error when checking : expected dense_3_input to have shape  

(None, 40) 但得到了形状为 (40, 1) 的数组

是否有人愿意指出我应该如何测试模型的正确方向?我不知道model.predict() 的输入应该是什么。

完整代码可以在here找到。

【问题讨论】:

  • 您检查过训练和测试音频文件的形状吗?包括sample_rate。它们必须相同,否则您需要将 test 转换为与 train 相同。
  • 您的test_X 必须与您用于训练的X 的类型(包括形状)完全相同
  • 在您的 X 和 val_X 中,您有一个额外的“batch_size”列,您的 test_X 中缺少该列。使用 Marcin stackoverflow.com/a/48239160/4132383 或 np.expand_dims(test_X, axis=0) 的解决方案

标签: python audio machine-learning neural-network keras


【解决方案1】:

所以:

  1. 最简单的解决方法就是重塑test_x

    test_x = test_x.reshape((1, 40))
    
  2. 更复杂的是重用您拥有的管道来创建trainvalid 集,也用于测试集。请注意,在test 的情况下,您应用于数据文件的过程完全不同。我会创建一个测试数据框:

    test_dataframe = pd.DataFrame({'filename': ["here path to test file"]}
    

    然后重用现有管道来创建验证集。

【讨论】:

  • 即使我把 test_x = text_x.reshape((1,40)) ,我仍然得到一个错误。错误是('检查时出错:预期dense_3_input具有形状(None,40)但得到形状为(40, 1)的数组','发生在索引0')
  • 你确定你喂的是正确的矩阵吗?可以分享一下sn-p的代码吗?
  • 看来我之前犯了一个错误,test_X = test_X.reshape((1,40)) 成功了!感谢您的帮助!但是,我想知道您是否可以帮助我解释输出?从print(model.predict(test_X)) 我得到:[[ 2.88744161e-16 2.31273791e-08 1.15574961e-14 9.50696986e-12 9.92713869e-01 5.40378940e-13 3.16615818e-08 7.28613138e-03 2.81731734e-16 1.57086722e-11]] 我不明白这些数字是什么意思,因为这应该是一个分类问题。我该如何解释这些? @MarcinMożejko
  • 正如人们可以轻松检查的那样 - 这些数字是总和 1 的正数。这可能被解释为给定示例属于类i 的概率。另一件事-我介意投票-我梦想着keras的金徽章;)
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多