InvalidArgumentError: ConcatOp : Dimensiones de las entradas debe coincidir con la hora de predecir en X_test con Conv2D - ¿por qué?

0

Pregunta

Estoy aprendiendo Tensorflow y estoy tratando de construir un clasificador en la Moda del conjunto de datos MNIST. Puedo ajustar el modelo, pero cuando trato de predecir en mi set de prueba me sale el siguiente error:

y_pred = model.predict(X_test).argmax(axis=1)

InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [1,32,10] vs. shape[312] = [1,16,10] [Op:ConcatV2] name: concat

No tengo un error si me predecir en X_test en lotes, por ejemplo:

y_pred = []
step_size = 10
for i in trange(0, len(X_test), step_size):
  y_pred += model.predict(X_test[i:i+step_size]).argmax(axis=1).tolist()[0]

He pasado algún tiempo buscando en google y busca otros ejemplos de la misma error, pero todavía no puede averiguar lo que estoy haciendo mal. Yo he probado un par de cosas diferentes, tales como la aplicación de la escala y ampliar las dimensiones de los pasos manualmente a X_train y X_test antes de construir el modelo, pero obtiene el mismo resultado.

Este es mi código completo (usando Python 3.7.12 y Tensorflow 2.7.0):

import tensorflow as tf # 2.7.0
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# load data 
mnist = tf.keras.datasets.fashion_mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Build model 

# Input 
inputs = tf.keras.Input(shape=X_train[0].shape)

# # Scale 
x = tf.keras.layers.Rescaling(scale=1.0/255)(inputs)

# Add extra dimension for use in conv2d
x = tf.expand_dims(x, -1)

# Conv2D
x = tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu", strides=2)(x)
x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3, 3), activation="relu", strides=2)(x)
x = tf.keras.layers.Conv2D(filters=128, kernel_size=(3, 3), activation="relu", strides=2)(x)

# Flatten
x = tf.keras.layers.Flatten()(x),
x = tf.keras.layers.Dropout(rate=.2)(x)  # 20% chance of dropout  
x = tf.keras.layers.Dense(512, activation='relu')(x)
x = tf.keras.layers.Dropout(rate=.2)(x)   
x = tf.keras.layers.Dense(K, activation='softmax')(x)

model = tf.keras.Model(inputs=inputs, outputs=x)

# Compile
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# Fit
r = model.fit(X_train, y_train, validation_data=[X_test, y_test], epochs=10)

# Throws an error
y_pred = model.predict(X_test).argmax(axis=1)

Lo que da

InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [1,32,10] vs. shape[312] = [1,16,10] [Op:ConcatV2] name: concat
1

Mejor respuesta

1

Con model.predict usted está haciendo predicciones sobre los lotes como se indica aquí:

Los cálculos se realizan en lotes. Este método está diseñado para el procesamiento por lotes de grandes cantidades de insumos. No está pensado para su uso en el interior de los bucles que iterar a través de los datos de proceso y de un pequeño número de entradas en un momento.

Pero el tamaño de X_test no es divisible por el defecto batch_size=32. Creo que esto podría ser la causa de su problema. Usted puede cambiar su batch_size 16 por ejemplo, y va a trabajar:

y_pred = model.predict(X_test, batch_size=16).argmax(axis=1)
print(y_pred)
[[ 8  0  2 ... 14  8  2]
 [15 15  8 ... 10  8 14]
 [ 5 13  4 ...  4  5  6]
 ...
 [11 11 12 ...  7  2  3]
 [ 3  8  0 ... 15  3 14]
 [ 3 13  1 ...  1 15  0]]

Usted también podría usar model.predict_on_batch(X_test) para hacer predicciones para un solo lote de muestras. Sin embargo, son más flexibles si utiliza la función de llamada de su modelo directamente:

y_pred = model(X_test[:10])
tf.print(tf.argmax(y_pred, axis=1), summarize=-1)
[[2 8 0 1 1 1 8 2 2 6]]
2021-11-22 13:44:08

Gracias, funciona!! Estoy un poco confundido sobre el 'lote' argumento - ¿qué pasaría si mi tamaño de la muestra era un número primo? Parece que voy a necesitar para hacer la lectura más acerca de las predicciones :)
hulky.smash

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................