InvalidArgumentError: ConcatOp : Dimensions des entrées doit correspondre aux prévisions sur X_test avec Conv2D - pourquoi?

0

La question

Je suis en train d'apprendre Tensorflow et suis en train de construire un classificateur sur le Mode MNIST dataset. Je peux adapter le modèle, mais lorsque je tente de prédire sur mon jeu de test j'obtiens l'erreur suivante:

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

Je n'ai pas d'erreur si je prédis sur X_test en lots, par exemple:

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]

J'ai passé un peu de temps sur google et de regarder les autres exemples de la même erreur, mais ne peut toujours pas comprendre ce que je fais mal. J'ai essayé plusieurs choses différentes, telles que l'application de l'échelle et de développer les dimensions étapes manuellement à X_train et X_test avant la construction du modèle, mais obtenir le même résultat.

C'est mon code complet (à l'aide de Python 3.7.12 et 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)

Ce qui donne

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

La meilleure réponse

1

Avec model.predict vous faire des prédictions sur les lots comme indiqué ici:

Le calcul est effectué dans les lots. Cette méthode est conçue pour le traitement par lot d'un grand nombre d'entrées. Il n'est pas prévu pour une utilisation à l'intérieur de la boucle qui itère sur vos données et de les traiter de petits nombres d'entrées à la fois.

Mais la taille de X_test n'est pas divisible par défaut batch_size=32. Je pense que cela pourrait être la cause de votre problème. Vous pouvez changer votre batch_size 16 par exemple et ça marche:

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]]

Vous pouvez également utiliser model.predict_on_batch(X_test) pour faire des prédictions pour un seul lot d'échantillons. Cependant, vous êtes plus souple si vous utilisez la fonction d'appel de votre modèle directement:

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

Merci, ça marche!! Je suis un peu confus au sujet de la "batch" de l'argument - qu'arriverait-il si mon la taille de l'échantillon est un nombre premier? On dirait que je vais devoir faire plus de lecture sur des prédictions :)
hulky.smash

Dans d'autres langues

Cette page est dans d'autres langues

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