我正在學習 Tensorflow 并嘗試在 Fashion 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,我不會收到錯誤,例如:
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,但得到相同的結果。
這是我的完整代碼(使用 Python 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
uj5u.com熱心網友回復:
隨著model.predict如說你正在對批次預言在這里:
計算是分批進行的。此方法專為批量處理大量輸入而設計。它不適用于迭代資料并一次處理少量輸入的回圈內部。
但是X_test默認情況下的大小不能被整除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]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363848.html
上一篇:使用AveragePooling2D代替GlobalAveragePooling2D替換FCN后的Dense層進行分類
下一篇:計算影像嵌入與一組影像嵌入的距離
