ValueError:入力のチェック時にエラーが発生しました:conv2d_5_inputの形状が(6705、20、130)であると予想されましたが、形状(20、130、1)の配列が取得されました
私は11クラスのオーディオファイルのデータセットを使用しており、畳み込みニューラルネットワークを使用してそれらのオーディオファイルを分類しようとしました。
私のモデル:
train_data = np.array(X)
train_labels = np.array(y)
model = Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=train_data.shape))
model.add(layers.MaxPool2D(2,2))
model.add(layers.Conv2D(32, (3,3), activation='relu'))
model.add(layers.MaxPool2D(2,2))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation="relu"))
model.add(layers.Dense(34, activation="relu"))
model.add(layers.Dense(NUM_LABELS))
model.summary()
train_dataは、(6705、20、130)の形のlibrosaを使用してロードされたオーディオです。
train_labelは、(6705、11)の形をしたワンホットベクトルの配列です。
寸法を拡張するか、形状を変更するかreshaped_train_data = np.expand_dims(train_data, axis=3)
:reshaped_train_data = train_data.reshape(-1, train_data.shape[1], train_data.shape[2], 1)
そしてそれを訓練しようとしました: history = model.fit(reshaped_train_data , train_labels, epochs=50, validation_split=0.1)
次のエラーが発生します。ValueError:入力のチェック時にエラーが発生しました:conv2d_5_inputの形状が(6705、20、130)であると予想されましたが、形状(20、130、1)の配列が取得されました
モデルをトレーニングできるように、形状を変更したり、拡張したりするにはどうすればよいですか?
回答
2つの間違いがあります:
- トレーニングデータの形状
- conv2dinput_shapeパラメータ
トレーニングデータは4次元(バッチ、行、列、チャネル)である必要があるため、 train_data = np.expand_dims(train_data, axis=3)
input_shape
を含まない整数のタプルであるsample axis
ため、model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=train_data.shape[1:]))
ランダム入力を使用したサンプルコードは次のとおりです。
import numpy as np
import tensorflow.keras.layers as layers
from tensorflow import keras
NUM_LABELS = 11
train_data = np.random.random(size=(6705, 20, 130))
###############expand shape################
train_data = np.expand_dims(train_data, axis=3)
# generate one-hot random vector
train_labels = np.eye(11)[np.random.choice(1, 6705)]
model = keras.Sequential()
###############input_shape################
model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=train_data.shape[1:]))
model.add(layers.MaxPool2D(2,2))
model.add(layers.Conv2D(32, (3,3), activation='relu'))
model.add(layers.MaxPool2D(2,2))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation="relu"))
model.add(layers.Dense(34, activation="relu"))
model.add(layers.Dense(NUM_LABELS))
model.summary()
model.compile(
loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
)
history = model.fit(train_data , train_labels, epochs=1, validation_split=0.1)
結果:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 18, 128, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 9, 64, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 7, 62, 32) 9248
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 3, 31, 32) 0
_________________________________________________________________
flatten (Flatten) (None, 2976) 0
_________________________________________________________________
dense (Dense) (None, 128) 381056
_________________________________________________________________
dense_1 (Dense) (None, 34) 4386
_________________________________________________________________
dense_2 (Dense) (None, 11) 385
=================================================================
Total params: 395,395
Trainable params: 395,395
Non-trainable params: 0
_________________________________________________________________
189/189 [==============================] - 8s 42ms/step - loss: 16.0358 - accuracy: 0.0000e+00 - val_loss: 16.1181 - val_accuracy: 0.0000e+00