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)
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
Ci sono 2 errori:
- forma dei dati di addestramento
- 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 axis
so 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