ValueError:入力のチェック時にエラーが発生しました:conv2d_5_inputの形状が(6705、20、130)であると予想されましたが、形状(20、130、1)の配列が取得されました

Aug 22 2020

私は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)の配列が取得されました

モデルをトレーニングできるように、形状を変更したり、拡張したりするにはどうすればよいですか?

回答

1 GirishDattatrayHegde Aug 22 2020 at 21:45

2つの間違いがあります:

  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