Estableciendo la forma de entrada durante el entrenamiento utilizando keras.
Estoy intentando entrenar un conjunto de datos usando keras que tiene xtrain.shape ---> (2040, 2, 5000)
y ytrain.shape ---> (2040,)
(Datos reales). El conjunto de datos de xtrain
y ytrain
miniaturizado muestra lo siguiente:
xtrain
array([[[ 2, 2, 7, 1, 5],
[ 1, 2, 3, 4, 3]],
[[ 5, 0, 3, 1, 6],
[ 5, 6, 7, 8, 6]],
[[ 2, 9, 8, 8, 7],
[ 9, 10, 11, 12, 2]],
[[ 5, 7, 7, 6, 8],
[13, 14, 15, 16, 1]]])
ytrain
array([0,1,2,3])
Cuando intenté construir un modelo de red utilizando:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras.losses import sparse_categorical_crossentropy
from tensorflow.keras.optimizers import Adam
input_shape = (2,5000)
no_classes = 7
loss_function = sparse_categorical_crossentropy
no_epochs = 100
optimizer = Adam()
validation_split = 0.2
verbosity = 1
# Crear el modelo
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(no_classes, activation='softmax'))
# Compilar el modelo
model.compile(loss=loss_function,
optimizer=optimizer,
metrics=['accuracy'])
# Ajustar los datos al modelo
history = model.fit(input_train, target_train,
batch_size=batch_size,
epochs=no_epochs,
verbose=verbosity,
validation_split=validation_split)
Obtengo el siguiente error:
ValueError: La entrada 0 de la capa "conv2d_2" no es compatible con la capa: se esperaba min_ndim=4, se encontró ndim=3. Se recibió la forma completa: (None, 2, 5000)
Estoy confundido acerca de cómo configurar la forma de entrada durante la creación de la red. ¿Es esto debido a la forma de la entrada?
davy.ai
Sí, el error se debe a que la forma de la entrada proporcionada a la capa
Conv2D
es tridimensional(2,5000)
en lugar de la esperada, que es tetradimensional.Como estás trabajando con una capa de convolución 2D, los datos de entrada deben tener una forma tetradimensional
(tamaño_lote, altura, ancho, canales)
. En tu caso, necesitas remodelar tus datosxtrain
a(2040, 2, 5000, 1)
, donde la última dimensión representa el número de canales.Puedes usar la función
numpy.reshape()
para remodelar tu datos antes de pasarlos al modelo.Aquí tienes el fragmento de código modificado:
Ten en cuenta que he agregado una nueva dimensión a
input_shape
y también he remodeladoxtrain
para que tenga una forma tetradimensional.