質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

受付中

ディープラーニングでの音声分類の"conv2d"のエラーについて

hanamaru018
hanamaru018

総合スコア0

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0リアクション

0クリップ

140閲覧

投稿2022/11/25 03:17

編集2022/11/25 09:14

前提

Pythonでディープラーニングでの音声分類を行っています。
ネット(https://qiita.com/cvusk/items/61cdbce80785eaf28349) にあるコードを参考にしたので、数字が異なるためエラーになっていると思いますが、どこを変更したらいいかわかりません。
初心者であるため、改善方法と説明を詳しく教えていただきたいです。よろしくお願いいたします。
学習データとテストデータに分けるところまでできて、kerasでの機械学習で手詰まっています。

実現したいこと

正解か正解でないかの二種類のみでの分類を行う。学習データとテストデータに分けるところまでできています。

発生している問題・エラーメッセージ

Traceback (most recent call last): File ~\Downloads\music-cnn\music_keras.py:39 in <module> x_1 = cba(inputs, filters=32, kernel_size=(1,8), strides=(1,2)) File ~\Downloads\music-cnn\music_keras.py:30 in cba x = Conv2D(filters, kernel_size=kernel_size, strides=strides, padding='same')(inputs) File ~\anaconda3\lib\site-packages\keras\utils\traceback_utils.py:70 in error_handler raise e.with_traceback(filtered_tb) from None File ~\anaconda3\lib\site-packages\keras\engine\input_spec.py:250 in assert_input_compatibility raise ValueError( ValueError: Input 0 of layer "conv2d_236" is incompatible with the layer: expected min_ndim=4, found ndim=1. Full shape received: (None,)

該当のソースコード

misic_data.py

import os import random import numpy as np import pandas as pd import librosa import librosa.display import matplotlib.pyplot as plt import seaborn as sn from sklearn import model_selection from sklearn import preprocessing import IPython.display as ipd import librosa import librosa.display # define directories meta_file = "C:/Users/hosei/Downloads/music-cnn/data-THE_REVELATION.csv" audio_dir = "C:/Users/hosei/Downloads/music-cnn/music/output_THE_REVELATION" # load metadata meta_data = pd.read_csv(meta_file) # get data size data_size = meta_data.shape print(data_size) # arrange target label and its name class_dict = {} for i in range(data_size[0]): if meta_data.loc[i,"target"] not in class_dict.keys(): class_dict[meta_data.loc[i,"target"]] = meta_data.loc[i,"category"] # load a wave data def load_wave_data(audio_dir, file_name): file_path = os.path.join(audio_dir, file_name) x, fs = librosa.load(file_path, sr=44100) return x,fs # change wave data to mel-stft def calculate_melsp(x, n_fft=1024, hop_length=128): stft = np.abs(librosa.stft(x, n_fft=n_fft, hop_length=hop_length))**2 log_stft = librosa.power_to_db(stft) melsp = librosa.feature.melspectrogram(S=log_stft,n_mels=128) return melsp # display wave in plots def show_wave(x): plt.plot(x) plt.show() # display wave in heatmap def show_melsp(melsp, fs): librosa.display.specshow(melsp, sr=fs) plt.colorbar() plt.show() # example data x, fs = load_wave_data(audio_dir, meta_data.loc[0,"filename"]) #print(x) melsp = calculate_melsp(x) print("wave size:{0}\nmelsp size:{1}\nsamping rate:{2}".format(x.shape, melsp.shape, fs)) show_wave(x) show_melsp(melsp, fs) # data augmentation: add white noise def add_white_noise(x, rate=0.002): return x + rate*np.random.randn(len(x)) # data augmentation: shift sound in timeframe def shift_sound(x, rate=2): return np.roll(x, int(len(x)//rate)) # data augmentation: stretch sound def stretch_sound(x, rate=1.1): input_length = len(x) x = librosa.effects.time_stretch(x, rate) if len(x)>input_length: return x[:input_length] else: return np.pad(x, (0, max(0, input_length - len(x))), "constant") # change wave data to mel-stft def calculate_melsp(x, n_fft=1024, hop_length=128): stft = np.abs(librosa.stft(x, n_fft=n_fft, hop_length=hop_length))**2 log_stft = librosa.power_to_db(stft) melsp = librosa.feature.melspectrogram(S=log_stft,n_mels=128) return melsp # get training dataset and target dataset x = list(meta_data.loc[:,"filename"]) y = list(meta_data.loc[:, "target"]) x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.25, stratify=y) print("x train:{0}\ny train:{1}\nx test:{2}\ny test:{3}".format(len(x_train), len(y_train), len(x_test), len(y_test))) # showing the classes are equally splitted a = np.zeros(50) for c in y_test: a[c] += 1 print(a) freq = 128 time = 1723 # save wave data in npz, with augmentation def save_np_data(filename, x, y, aug=None, rates=None): np_data = np.zeros(freq*time*len(x)).reshape(len(x), freq, time) np_targets = np.zeros(len(y)) for i in range(len(y)): _x, fs = load_wave_data(audio_dir, x[i]) if aug is not None: _x = aug(x=_x, rate=rates[i]) _x = calculate_melsp(_x) np_data[i] = _x np_targets[i] = y[i] np.savez(filename, x=np_data, y=np_targets) # save test dataset if not os.path.exists("esc_melsp_test.npz"): save_np_data("esc_melsp_test.npz", x_test, y_test) # save raw training dataset if not os.path.exists("esc_melsp_train_raw.npz"): save_np_data("esc_melsp_train_raw.npz", x_train, y_train) # save training dataset with white noise if not os.path.exists("esc_melsp_train_wn.npz"): rates = np.random.randint(1,50,len(x_train))/10000 save_np_data("esc_melsp_train_wn.npz", x_train, y_train, aug=add_white_noise, rates=rates) # save training dataset with sound shift if not os.path.exists("esc_melsp_train_ss.npz"): rates = np.random.choice(np.arange(2,6),len(y_train)) save_np_data("esc_melsp_train_ss.npz", x_train, y_train, aug=shift_sound, rates=rates) # save training dataset with stretch if not os.path.exists("esc_melsp_train_st.npz"): rates = np.random.choice(np.arange(80,120),len(y_train))/100 save_np_data("esc_melsp_train_st.npz", x_train, y_train, aug=stretch_sound, rates=rates) # save training dataset with combination of white noise and shift or stretch if not os.path.exists("esc_melsp_train_com.npz"): np_data = np.zeros(freq*time*len(x_train)).reshape(len(x_train), freq, time) np_targets = np.zeros(len(y_train)) for i in range(len(y_train)): x, fs = load_wave_data(audio_dir, x_train[i]) x = add_white_noise(x=x, rate=np.random.randint(1,50)/1000) if np.random.choice((True,False)): x = shift_sound(x=x, rate=np.random.choice(np.arange(2,6))) else: x = stretch_sound(x=x, rate=np.random.choice(np.arange(80,120))/100) x = calculate_melsp(x) np_data[i] = x np_targets[i] = y_train[i] np.savez("esc_melsp_train_com.npz", x=np_data, y=np_targets)

該当のソースコード

music_keras.py

import music_data import numpy as np import keras from keras.models import Model from keras.layers import Input, Dense, Dropout, Activation from keras.layers import Conv2D, GlobalAveragePooling2D from keras.layers import BatchNormalization, Add from keras.callbacks import EarlyStopping, ModelCheckpoint # redefine target data into one hot vector classes = 50 X_train = np.array(music_data.x_train) X_test = np.array(music_data.x_test) Y_train = np.array(music_data.y_train) Y_test = np.array(music_data.y_test) y_train = keras.utils.to_categorical(Y_train, classes) y_test = keras.utils.to_categorical(Y_test, classes) def cba(inputs, filters, kernel_size, strides): x = Conv2D(filters, kernel_size=kernel_size, strides=strides, padding='same')(inputs) x = BatchNormalization()(x) x = Activation("relu")(x) return x # define CNN inputs = Input(shape=(X_train.shape[1:])) x_1 = cba(inputs, filters=32, kernel_size=(1,8), strides=(1,2)) x_1 = cba(x_1, filters=32, kernel_size=(8,1), strides=(2,1)) x_1 = cba(x_1, filters=64, kernel_size=(1,8), strides=(1,2)) x_1 = cba(x_1, filters=64, kernel_size=(8,1), strides=(2,1)) x_2 = cba(inputs, filters=32, kernel_size=(1,16), strides=(1,2)) x_2 = cba(x_2, filters=32, kernel_size=(16,1), strides=(2,1)) x_2 = cba(x_2, filters=64, kernel_size=(1,16), strides=(1,2)) x_2 = cba(x_2, filters=64, kernel_size=(16,1), strides=(2,1)) x_3 = cba(inputs, filters=32, kernel_size=(1,32), strides=(1,2)) x_3 = cba(x_3, filters=32, kernel_size=(32,1), strides=(2,1)) x_3 = cba(x_3, filters=64, kernel_size=(1,32), strides=(1,2)) x_3 = cba(x_3, filters=64, kernel_size=(32,1), strides=(2,1)) x_4 = cba(inputs, filters=32, kernel_size=(1,64), strides=(1,2)) x_4 = cba(x_4, filters=32, kernel_size=(64,1), strides=(2,1)) x_4 = cba(x_4, filters=64, kernel_size=(1,64), strides=(1,2)) x_4 = cba(x_4, filters=64, kernel_size=(64,1), strides=(2,1)) x = Add()([x_1, x_2, x_3, x_4]) x = cba(x, filters=128, kernel_size=(1,16), strides=(1,2)) x = cba(x, filters=128, kernel_size=(16,1), strides=(2,1)) x = GlobalAveragePooling2D()(x) x = Dense(classes)(x) x = Activation("softmax")(x) model = Model(inputs, x) # initiate Adam optimizer opt = keras.optimizers.adam(lr=0.00001, decay=1e-6, amsgrad=True) # Let's train the model using Adam with amsgrad model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) model.summary()

試したこと

https://teratail.com/questions/291260 
この質問を見て改善しようとしましたが、なぜinput_shape=x.shape[1:]の部分をinput_shape=(256,256,3)にしているのかわかりませんでした。(256,256,3)にしてみたら、コード自体はエラーもなく動いたのですが、自分のやっているものでもこの数字にしていいのかわかりません。

補足情報(FW/ツールのバージョンなど)

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jbpb0

2022/11/25 03:33

質問に記載のエラーメッセージよりも上に「Traceback」と書かれてたら、そこから下をできるだけ省略せずに質問に記載してください (ここに書くのではなく、質問を編集して追記する) ユーザー名等の個人情報は伏せ字でいいですが、それ以外はできるだけそのまま記載してください
jbpb0

2022/11/28 05:12

https://qiita.com/cvusk/items/61cdbce80785eaf28349 の「コード全文。」をクリックしたら出てくる https://github.com/shibuiwilliam/audio_classification_keras の、コードのファイル https://github.com/shibuiwilliam/audio_classification_keras/blob/master/esc50_classification.ipynb の内容と、質問に記載のコードを比べると、 https://github.com/shibuiwilliam/audio_classification_keras/blob/master/esc50_classification.ipynb の、「Preparation for deep learning」と書かれてるところから、「Define convolutional neural network」と書かれてるところの間のコードが、質問に記載のコードでは、ほとんど欠落してます そのため、本来ならばそこで作成されるはずの x_train, y_train, x_test, y_test が、質問のコードでは作成されず、質問のコードではそれと異なるデータが使われてます それが、この質問のエラーの原因だと思います
hanamaru018

2022/11/28 08:22

ありがとうございます!動きました!

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。