ValueError: errore durante il controllo dell'input: previsto che conv2d_5_input avesse forma (6705, 20, 130) ma ha ottenuto un array con forma (20, 130, 1)

Aug 22 2020

Sto usando un set di dati di 11 classi di file audio e usando la rete neurale convoluzionale ho provato a classificare quei file audio.

Il mio modello:

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 è l'audio caricato utilizzando librosa con la forma di (6705, 20, 130)

train_label è un array di vettori one-hot con la forma di (6705, 11)

Sia che espandi le dimensioni: reshaped_train_data = np.expand_dims(train_data, axis=3)o le rimodello:reshaped_train_data = train_data.reshape(-1, train_data.shape[1], train_data.shape[2], 1)

e ho provato ad addestrarlo: history = model.fit(reshaped_train_data , train_labels, epochs=50, validation_split=0.1)

Mi dà il seguente errore: ValueError: errore durante il controllo dell'input: previsto conv2d_5_input per avere una forma (6705, 20, 130) ma ha ottenuto un array con forma (20, 130, 1)

Come rimodellarlo o ampliarlo in modo da poter addestrare il mio modello?

Risposte

1 GirishDattatrayHegde Aug 22 2020 at 21:45

Ci sono 2 errori:

  1. forma dei dati di addestramento
  2. parametro conv2d input_shape

i dati di addestramento dovrebbero essere quadridimensionali (batch, righe, colonne, canali) quindi usali train_data = np.expand_dims(train_data, axis=3)

input_shapeè una tupla di interi che non include il sample axisso usemodel.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=train_data.shape[1:]))

Ecco un esempio di codice che utilizza input casuale:

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)

Risultati:

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