InvalidArgumentError: ConcatOp: Conv2D ile X_test üzerinde tahmin yaparken girdilerin boyutları eşleşmelidir-neden?

0

Soru

Tensorflow'u öğreniyorum ve Moda MNIST veri kümesinde bir sınıflandırıcı oluşturmaya çalışıyorum. Modele uyabilirim, ancak test setimde tahmin etmeye çalıştığımda aşağıdaki hatayı alıyorum:

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

Örneğin, toplu olarak X_test üzerinde tahmin edersem bir hata almıyorum:

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]

Google'da arama yapmak ve aynı hatanın diğer örneklerine bakmak için biraz zaman harcadım ama yine de neyi yanlış yaptığımı anlayamıyorum. Modeli oluşturmadan önce ölçek ve genişletme boyutları adımlarını manuel olarak X_train ve X_test'e uygulamak gibi birkaç farklı şey denedim, ancak aynı sonucu elde ettim.

Bu benim tam kodum (Python 3.7.12 ve Tensorflow 2.7.0 kullanarak):

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)

Hangi verir

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

En iyi cevabı

1

İle model.predict burada belirtildiği gibi gruplar üzerinde tahminler yapıyorsunuz:

Hesaplama toplu olarak yapılır. Bu yöntem, çok sayıda girdinin toplu olarak işlenmesi için tasarlanmıştır. Verileriniz üzerinde yineleme yapan ve aynı anda az sayıda girdi işleyen döngüler içinde kullanılmak üzere tasarlanmamıştır.

Ama büyüklüğü X_test varsayılan olarak eşit olarak bölünemez batch_size=32. Sanırım sorunun nedeni bu olabilir. Seninkini değiştirebilirsin. batch_size örneğin 16'ya kadar ve işe yarayacak:

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

Ayrıca kullanabilirsiniz model.predict_on_batch(X_test) tek bir örnek grubu için tahminler yapmak. Ancak, modelinizin çağrı işlevini doğrudan kullanırsanız en esnek olan sizsiniz:

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

Teşekkür ederim, işe yaradı!! 'Toplu iş' argümanı hakkında biraz kafam karıştı-örneklem büyüklüğüm asal sayı olsaydı ne olurdu? Tahminler hakkında daha fazla okuma yapmam gerekecek gibi görünüyor :)
hulky.smash

Diğer dillerde

Bu sayfa diğer dillerde

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