【问题标题】:How do I fix this code error? ValueError: A target array with shape (6985, 10) was passed for an output of shape (None, 100)如何修复此代码错误? ValueError:形状为 (6985, 10) 的目标数组已传递给形状 (None, 100) 的输出
【发布时间】:2022-08-03 19:35:12
【问题描述】:

我试图按照音频分类教程进行操作,但遇到了两个错误。我搜索了解决方案,但是当我尝试将 -sparse_categorical_crossentropy 代替 categorical_crossentropy 时,它们没有工作。我不太确定如何修复这些错误,因为其中一个是关于 num_labels 引用,我在代码中的其他任何地方都找不到。

**这是我得到的两个错误:**

```model.add(Dense(num_labels))```

-------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)
<ipython-input-67-ed8693eee280> in <module>()
----> 1 model.add(Dense(num_labels))

NameError: name \'num_labels\' is not defined


  [1]: https://i.stack.imgur.com/LhWTq.png





```from tensorflow.keras.callbacks import ModelCheckpoint
from datetime import datetime 

num_epochs = 200
num_batch_size = 32

checkpointer = ModelCheckpoint(filepath=\'saved_models/audio_classification.hdf5\', 
                               verbose=1, save_best_only=True)
start = datetime.now()

model.fit(X_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(X_test, y_test), callbacks=[checkpointer], verbose=1)


duration = datetime.now() - start
print(\"Training completed in time: \", duration)```
---------------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-73-d89e0e6707f0> in <module>()
      9 start = datetime.now()
     10 
---> 11 model.fit(X_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(X_test, y_test), callbacks=[checkpointer], verbose=1)
     12 
     13 

4 frames
/usr/local/lib/python3.7/dist-packages/keras/engine/training_utils_v1.py in check_loss_and_target_compatibility(targets, loss_fns, output_shapes)
    811           raise ValueError(\'A target array with shape \' + str(y.shape) +
    812                            \' was passed for an output of shape \' + str(shape) +
--> 813                            \' while using as loss `\' + loss_name + \'`. \'
    814                            \'This loss expects targets to have the same shape \'
    815                            \'as the output.\')

ValueError: A target array with shape (6985, 10) was passed for an output of shape (None, 100) while using as loss `categorical_crossentropy`. This loss expects targets to have the same shape as the output.

这是到目前为止的代码:

```#@title Preprocessing...
import librosa
import os
from sklearn.model_selection import train_test_split
import tensorflow as tf

#from keras.utils import to_categorical
from tensorflow.keras.utils import to_categorical
import numpy as np
from tqdm import tqdm

DATA_PATH = \"./data/\"


# Input: Folder Path
# Output: Tuple (Label, Indices of the labels, one-hot encoded labels)
def get_labels(path=DATA_PATH):
    labels = os.listdir(path)
    label_indices = np.arange(0, len(labels))
    return labels, label_indices, to_categorical(label_indices)


# convert file to wav2mfcc
# Mel-frequency cepstral coefficients
def wav2mfcc(file_path, n_mfcc=20, max_len=11):
    wave, sr = librosa.load(file_path, mono=True, sr=None)
    wave = np.asfortranarray(wave[::3])
    mfcc = librosa.feature.mfcc(wave, sr=16000, n_mfcc=n_mfcc)

    # If maximum length exceeds mfcc lengths then pad the remaining ones
    if (max_len > mfcc.shape[1]):
        pad_width = max_len - mfcc.shape[1]
        mfcc = np.pad(mfcc, pad_width=((0, 0), (0, pad_width)), mode=\'constant\')

    # Else cutoff the remaining parts
    else:
        mfcc = mfcc[:, :max_len]
    
    return mfcc


def save_data_to_array(path=DATA_PATH, max_len=11, n_mfcc=20):
    labels, _, _ = get_labels(path)

    for label in labels:
        # Init mfcc vectors
        mfcc_vectors = []

        wavfiles = [path + label + \'/\' + wavfile for wavfile in os.listdir(path + \'/\' + label)]
        for wavfile in tqdm(wavfiles, \"Saving vectors of label - \'{}\'\".format(label)):
            mfcc = wav2mfcc(wavfile, max_len=max_len, n_mfcc=n_mfcc)
            mfcc_vectors.append(mfcc)
        np.save(label + \'.npy\', mfcc_vectors)


def get_train_test(split_ratio=0.6, random_state=42):
    # Get available labels
    labels, indices, _ = get_labels(DATA_PATH)

    # Getting first arrays
    X = np.load(labels[0] + \'.npy\')
    y = np.zeros(X.shape[0])

    # Append all of the dataset into one single array, same goes for y
    for i, label in enumerate(labels[1:]):
        x = np.load(label + \'.npy\')
        X = np.vstack((X, x))
        y = np.append(y, np.full(x.shape[0], fill_value= (i + 1)))

    assert X.shape[0] == len(y)

    return train_test_split(X, y, test_size= (1 - split_ratio), random_state=random_state, shuffle=True)



def prepare_dataset(path=DATA_PATH):
    labels, _, _ = get_labels(path)
    data = {}
    for label in labels:
        data[label] = {}
        data[label][\'path\'] = [path  + label + \'/\' + wavfile for wavfile in os.listdir(path + \'/\' + label)]

        vectors = []

        for wavfile in data[label][\'path\']:
            wave, sr = librosa.load(wavfile, mono=True, sr=None)
            # Downsampling
            wave = wave[::3]
            mfcc = librosa.feature.mfcc(wave, sr=16000)
            vectors.append(mfcc)

        data[label][\'mfcc\'] = vectors

    return data


def load_dataset(path=DATA_PATH):
    data = prepare_dataset(path)

    dataset = []

    for key in data:
        for mfcc in data[key][\'mfcc\']:
            dataset.append((key, mfcc))

    return dataset[:100]


# print(prepare_dataset(DATA_PATH))



!pip install librosa

upload kaggle.json

import pandas as pd
import os
import librosa
import librosa.display
import numpy as np
import IPython.display as ipd
import matplotlib.pyplot as plt
%matplotlib inline
!pip install kaggle

os.environ[\'KAGGLE_CONFIG_DIR\'] = \"/content\"

!kaggle datasets download -d chrisfilo/urbansound8k

!unzip urbansound8k.zip

file_name=\'fold5/100263-2-0-121.wav\'

audio_data, sampling_rate = librosa.load(file_name)
librosa.display.waveplot(audio_data,sr=sampling_rate)
ipd.Audio(file_name)

audio_data

sampling_rate

audio_dataset_path=\'/content/\'
metadata=pd.read_csv(\'UrbanSound8K.csv\')
metadata.head()

metadata[\'class\'].value_counts()

mfccs = librosa.feature.mfcc(y=audio_data, sr=sampling_rate, n_mfcc=40)

mfccs

def features_extractor(file):
    audio, sample_rate = librosa.load(file_name, res_type=\'kaiser_fast\') 
    mfccs_features = librosa.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=40)
    mfccs_scaled_features = np.mean(mfccs_features.T,axis=0)
    
    return mfccs_scaled_features


extracted_features=[]
for index_num,row in tqdm(metadata.iterrows()):
    file_name = os.path.join(os.path.abspath(audio_dataset_path),\'fold\'+str(row[\"fold\"])+\'/\',str(row[\"slice_file_name\"]))
    final_class_labels=row[\"class\"]
    data=features_extractor(file_name)
    extracted_features.append([data,final_class_labels])

extracted_features_df=pd.DataFrame(extracted_features,columns=[\'feature\',\'class\'])
extracted_features_df.head(10)

X=np.array(extracted_features_df[\'feature\'].tolist())
y=np.array(extracted_features_df[\'class\'].tolist())

from tensorflow.keras.utils import to_categorical
from sklearn.preprocessing import LabelEncoder
labelencoder=LabelEncoder()
y=to_categorical(labelencoder.fit_transform(y))

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)

Preprocessing is finished


import tensorflow as tf
print(tf.__version__)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Activation,Flatten
from tensorflow.keras.optimizers import Adam
from sklearn import metrics

model=Sequential()
###first layer
model.add(Dense(100,input_shape=(40,)))
model.add(Activation(\'relu\'))
model.add(Dropout(0.5))
###second layer
model.add(Dense(200))
model.add(Activation(\'relu\'))
model.add(Dropout(0.5))
###third layer
model.add(Dense(100))
model.add(Activation(\'relu\'))
model.add(Dropout(0.5))

###final layer

model.add(Activation(\'softmax\'))


model.add(Dense(num_labels))

model.compile(loss=\'categorical_crossentropy\',metrics=[\'accuracy\'],optimizer=\'adam\')

from tensorflow.keras.callbacks import ModelCheckpoint
from datetime import datetime 

num_epochs = 200
num_batch_size = 32

checkpointer = ModelCheckpoint(filepath=\'saved_models/audio_classification.hdf5\', 
                               verbose=1, save_best_only=True)
start = datetime.now()

model.fit(X_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(X_test, y_test), callbacks=[checkpointer], verbose=1)


duration = datetime.now() - start
print(\"Training completed in time: \", duration)```

    标签: python tensorflow


    【解决方案1】:

    如错误中所述,

    NameError:未定义名称“num_labels”

    因为您没有定义 'num_labels' 变量,所以会发生错误。请定义如下。

    #Defining num_labels
    num_labels=len(extracted_features_df['class'].unique())
    num_labels
    

    完整代码请参考gist。谢谢!

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2020-04-28
      • 1970-01-01
      相关资源
      最近更新 更多