InvalidArgumentError: ConcatOp : Dimensiuni de intrări ar trebui să se potrivească atunci când se estimează pe X_test cu Conv2D - de ce?

0

Problema

Eu sunt de învățare Tensorflow și sunt încercarea de a construi un clasificator pe Moda MNIST set de date. Pot potrivi modelul, dar când am încerca să prezică pe setul de testare primesc următoarea eroare:

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

Eu nu primesc o eroare dacă am prezis pe X_test în loturi, de exemplu:

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]

Am petrecut ceva timp pe google și se uită la alte exemple de aceeași eroare, dar încă nu pot da seama ce fac gresit. Am încercat câteva lucruri diferite, cum ar fi aplicarea pe scară și să se extindă dimensiunile pașii manual pentru X_train și X_test înainte de a construi modelul, dar pentru a obține același rezultat.

Acest lucru este meu de cod complet (folosind Python 3.7.12 și 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)

Care dă

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

Cel mai bun răspuns

1

Cu model.predict se face predicții pe loturi, după cum se menționează aici:

Calculul se face în loturi. Această metodă este conceput pentru prelucrarea lot de un număr mare de intrări. Acesta nu este destinat pentru utilizarea în interior de bucle care repeta peste datelor și procesul număr mic de factori de producție la un moment dat.

Dar dimensiunea X_test nu este divizibil cu cel default batch_size=32. Cred că asta ar putea fi cauza problemei. Ai putea schimba batch_size la 16 ani, de exemplu, și se va lucra:

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

Ai putea folosi, de asemenea, model.predict_on_batch(X_test) pentru a face previziuni pentru un singur lot de probe. Cu toate acestea, vă sunt cele mai flexibil dacă utilizați funcția de apel de modelul dvs. direct:

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

Mulțumesc, că funcționează!! Eu sunt un pic confuz despre " lot " argument ce s - ar întâmpla dacă mărimea eșantionului a fost un număr prim? Se pare că va trebui să facă mai mult citind despre predictii :)
hulky.smash

În alte limbi

Această pagină este în alte limbi

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