InvalidArgumentError:ConcatOp:มิติของ inputs ควรจะตรงกับตลังทำอยู่ X_test กับ Conv2D-ทำไม?

0

คำถาม

ฉันต้องเรียนรู้ Tensorflow และฉันพยายามจะสร้าง classifier บแฟชั่น MNIST วันที่. ฉันสามารถพอดีกับรุ่น,แต่ตอนที่ฉันพยายามทำนายว่าฉันทดสอบตั้งผมได้ติดตามข้อผิดพลาดคือ:

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

ฉันไม่เข้าใจเกิดข้อผิดพลาดถ้าฉันทำนายว่าอยู่ X_test ใน batches ตัวอย่างเช่น:

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]

ฉันใช้เวลาบางครั้งเซิร์ทกูเกิ้ลได้แล้วฉันเจและมองอีกตัวอย่างของคนเดียวกันเกิดข้อผิดพลาดแต่ก็ยังคิดไม่ออกว่าผมทำอะไรผิดพลาด ฉันพยายามไม่กี่อย่างที่ต่างกันอย่างเช่นสมัครที่ปรับขนาดและขยายขนาดภาพขั้นตอนด้วยตนเองเพื่อ X_train และ X_test ก่อนที่ตึกรุ่นแต่ได้ผลลัพธ์เดียวกัน.

นี่คือของฉันเต็มไปด้วยรหัส(ใช้ภาษาไพธอน 3.7.12 และ 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)

ซึ่งทำให้

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

คำตอบที่ดีที่สุด

1

กับ model.predict คุณกำลังทำให้ผมสงสัยในระยะเวลาอันสั้นใน batches ย่างที่พูด ที่นี่:

Computation ทำใน batches. นี่คือวิธีการออกแบบสำหรับประมวลผลกลุ่มภาพของขนาดใหญ่ของ inputs. มันไม่ได้ตั้งใจสำหรับใช้ภายในของบางอย่างนั้น iterate บข้อมูลของคุณและขั้นตอนเล็กๆตัวเลขของ inputs น

แต่ขนาด X_test ไม่ evenly divisible โดยค่าปริยาย batch_size=32. ฉันคิดว่านี่อาจจะเป็นสาเหตุของปัญหาของคุณ คุณสามารถเปลี่ยนของคุณ batch_size ที่ 16 สำหรับตัวอย่างและมันจะทำงาน:

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

คุณอาจจะยังใช้ model.predict_on_batch(X_test) จะทำให้ผมสงสัยในระยะเวลาอันสั้สำหรับนัดเดียวการประมวลผลกลุ่มภาพของตัวอย่าง อย่างไรก็ตามคุณเป็นส่วนใหญ่เรื่องมากเกี่ยวถ้าคุณใช้โทรเรียกฟังก์ชันของรุ่นของคุณโดยตรง:

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

ขอบคุณที่ทำงาน!! ฉันรู้สึกมึนเล็กน้อยเรื่อง'การประมวลผลกลุ่มภาพ'เถียงกัน-อะไรจะเกิดขึ้นถ้าตัวอย่างเลือดขนาดเป็นอันดับหนึ่งจำนวน? ดูเหมือนว่าฉันจะต้องทำมากกว่าอ่านหนังสือเกี่ยวกับผมสงสัยในระยะเวลาอันสั้:)
hulky.smash

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่