Tensorflow でセマンティック セグメンテーションのモデルをトレーニングしました。64 個の新しい画像のセットの予測を実行したい (これらはグレースケール画像であるため、チャネル数は 1 です)。このために、2 つのメソッドを作成し、結果を比較しました (最初は、これらが同じ値を提供すると予想していました)。
方法 A: すべての画像を 4D 配列 (NB_IMAGES、ROWS、COLS、1) にロードします。4D 配列全体で予測を実行します。つまり、すべての画像を同時に (バッチ サイズ = 64) 実行します。
方法 B: 各画像の予測を個別に実行します。各画像は、形状 (1、ROWS、COLS、1) の 4D 配列としてロードされます。バッチ サイズ = 1。
メソッド A はクラスの 1 つに対してこの結果を提供しました:
、およびメソッド B はこれを提供しました:
メソッド B はメソッド B よりも多くの情報を提供します。さらに、メソッド B は float64 で予測を提供しますが、メソッド A は float32 配列を生成します。
コードは次のとおりです。
for i, x in enumerate(img_list):
with Image.open(os.path.join(imgset_path, x)) as img_i:
img_i = np.array(img_i.convert('L'))
img_i_np = np.copy(img_i)
img_i_np = np.expand_dims(img_i_np, -1) # Expand dims and normalize
img_i_np = np.expand_dims(img_i_np, 0)
img_i_np - img_i_np.astype('float64')/255.
original[i,:,:,:] = np.copy(img_i_np[0,:,:,:])
img_i_np_check = np.copy(img_i)
img_i_np_check = np.expand_dims(img_i_np_check, -1)
img_i_np_check = np.expand_dims(img_i_np_check, 0)
img_i_np_check = img_i_np_check.astype('float64')/255.
pred_i = model.predict(img_i_np_check) # Method B
preds_check[i,:,:,:] = pred_i[0,:,:,:]
list_originals += [(x, i)]
# Run predictions
preds = model.predict(original) # Method A
モデルが同じで、batch_normalization が使用されておらず、データセットも同じであることを考えると、これらの予測の違いについて本当に迷っています。バッチサイズと予測の影響について知っている、または経験がある人はいますか?