[英]CNN Regression model predicting values far outside the expected range
我正在訓練一個多輸出 CNN 回歸 model,它在給定單個圖像輸入的情況下預測 x 和 y 坐標值。 圖像數據和相關的 x 和 y 目標標簽都已標准化為 0 和 1 的范圍內。但是,當使用 model 預測給定圖像的 x 和 y 值時,model 預測的值遠遠超出此范圍, 例如:
[114, -17] 而不是 [0.83, 0.16]
我無法找出原因,如果有人能夠提供一些見解,我將不勝感激。 找到下面使用的代碼:
IMAGESTRAIN_PATH = os.path.sep.join([BASE_PATH, "RegressionDatasetGrey"])
ANNOTSTRAIN_PATH = os.path.sep.join([BASE_PATH, "RegressionDatasetGrey.csv"])
IMAGESTEST_PATH = os.path.sep.join([BASE_PATH, "RegressionDSGreyTesting"])
ANNOTSTEST_PATH = os.path.sep.join([BASE_PATH, "RegressionDSGreyTesting.csv"])
print("[INFO] loading training dataset...")
rows = open(ANNOTSTRAIN_PATH).read().strip().split("\n")
data = []
targets = []
filenames = []
for row in rows:
row = row.split(",")
(filename, coordX, coordY) = row
coordX = float(int(coordX)/1920)
coordY = float(int(coordY)/1080)
imagePath = os.path.sep.join([IMAGESTRAIN_PATH, filename])
img = load_img(imagePath, color_mode="grayscale", target_size=(64, 80))
# img = img.size(1, 64, 80, 1)
img = img_to_array(img)
data.append(img)
targets.append((coordX, coordY))
filenames.append(filename)
trainImages = np.array(data, dtype="float32") / 255.0
trainCoords = np.array(targets, dtype="float32")
print("[INFO] loading testing dataset...")
rows1 = open(ANNOTSTEST_PATH).read().strip().split("\n")
data1 = []
targets1 = []
filenames1 = []
for row1 in rows1:
row1 = row1.split(",")
(filename1, coordX1, coordY1) = row1
coordX1 = float(int(coordX1)/1920)
coordY1 = float(int(coordY1)/1080)
imagePath1 = os.path.sep.join([IMAGESTEST_PATH, filename1])
image1 = load_img(imagePath1, color_mode="grayscale", target_size=(64, 80))
image1 = img_to_array(image1)
data1.append(image1)
targets1.append((coordX1, coordY1))
filenames1.append(filename1)
testImages = np.array(data1, dtype="float32") / 255.0
testCoords = np.array(targets1, dtype="float32")
inputs = Input(shape=(64, 80, 1))
x = inputs
x = Conv2D(16, (3, 3), padding='same')(x)
x = Activation('relu')(x)
# x = BatchNormalization()(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(32, (3, 3), padding='same')(x)
# x = BatchNormalization()(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(64, (3, 3), padding='same')(x)
# x = BatchNormalization()(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Flatten()(x)
x = Dense(128)(x)
x = Activation('relu')(x)
x = Dropout(0.3)(x)
x = Dense(64)(x)
x = Activation('relu')(x)
x = Dropout(0.3)(x)
x = Dense(2)(x)
x = Activation('linear')(x)
model = Model(inputs, x)
opt = Adam(lr=0.001)
model.compile(loss="mse", optimizer=opt)
# print(model.summary())
print("[INFO] training Regressor...")
History = model.fit(
trainImages, trainCoords,
validation_data=(testImages, testCoords),
batch_size=32,
epochs=50,
verbose=1, shuffle=True)
print("[INFO] Saving Model...")
model.save('ModelV12.h5')
N = 50
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, N), History.history["loss"], label="train_loss")
plt.plot(np.arange(0, N), History.history["val_loss"], label="val_loss")
plt.title("Loss on Training Set")
plt.xlabel("Epoch #")
plt.ylabel("Loss")
plt.legend(loc="lower left")
plt.savefig('RegressionPlot.png')
我正在訓練一個多輸出 CNN 回歸 model,它在給定單個圖像輸入的情況下預測 x 和 y 坐標值。 圖像數據和相關的 x 和 y 目標標簽都已標准化為 0 和 1 的范圍內。但是,當使用 model 預測給定圖像的 x 和 y 值時,model 預測的值遠遠超出此范圍, 例如:
[114, -17] 而不是 [0.83, 0.16]
我無法找出原因,如果有人能夠提供一些見解,我將不勝感激。 找到下面使用的代碼:
IMAGESTRAIN_PATH = os.path.sep.join([BASE_PATH, "RegressionDatasetGrey"])
ANNOTSTRAIN_PATH = os.path.sep.join([BASE_PATH, "RegressionDatasetGrey.csv"])
IMAGESTEST_PATH = os.path.sep.join([BASE_PATH, "RegressionDSGreyTesting"])
ANNOTSTEST_PATH = os.path.sep.join([BASE_PATH, "RegressionDSGreyTesting.csv"])
print("[INFO] loading training dataset...")
rows = open(ANNOTSTRAIN_PATH).read().strip().split("\n")
data = []
targets = []
filenames = []
for row in rows:
row = row.split(",")
(filename, coordX, coordY) = row
coordX = float(int(coordX)/1920)
coordY = float(int(coordY)/1080)
imagePath = os.path.sep.join([IMAGESTRAIN_PATH, filename])
img = load_img(imagePath, color_mode="grayscale", target_size=(64, 80))
# img = img.size(1, 64, 80, 1)
img = img_to_array(img)
data.append(img)
targets.append((coordX, coordY))
filenames.append(filename)
trainImages = np.array(data, dtype="float32") / 255.0
trainCoords = np.array(targets, dtype="float32")
print("[INFO] loading testing dataset...")
rows1 = open(ANNOTSTEST_PATH).read().strip().split("\n")
data1 = []
targets1 = []
filenames1 = []
for row1 in rows1:
row1 = row1.split(",")
(filename1, coordX1, coordY1) = row1
coordX1 = float(int(coordX1)/1920)
coordY1 = float(int(coordY1)/1080)
imagePath1 = os.path.sep.join([IMAGESTEST_PATH, filename1])
image1 = load_img(imagePath1, color_mode="grayscale", target_size=(64, 80))
image1 = img_to_array(image1)
data1.append(image1)
targets1.append((coordX1, coordY1))
filenames1.append(filename1)
testImages = np.array(data1, dtype="float32") / 255.0
testCoords = np.array(targets1, dtype="float32")
inputs = Input(shape=(64, 80, 1))
x = inputs
x = Conv2D(16, (3, 3), padding='same')(x)
x = Activation('relu')(x)
# x = BatchNormalization()(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(32, (3, 3), padding='same')(x)
# x = BatchNormalization()(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(64, (3, 3), padding='same')(x)
# x = BatchNormalization()(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Flatten()(x)
x = Dense(128)(x)
x = Activation('relu')(x)
x = Dropout(0.3)(x)
x = Dense(64)(x)
x = Activation('relu')(x)
x = Dropout(0.3)(x)
x = Dense(2)(x)
x = Activation('linear')(x)
model = Model(inputs, x)
opt = Adam(lr=0.001)
model.compile(loss="mse", optimizer=opt)
# print(model.summary())
print("[INFO] training Regressor...")
History = model.fit(
trainImages, trainCoords,
validation_data=(testImages, testCoords),
batch_size=32,
epochs=50,
verbose=1, shuffle=True)
print("[INFO] Saving Model...")
model.save('ModelV12.h5')
N = 50
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, N), History.history["loss"], label="train_loss")
plt.plot(np.arange(0, N), History.history["val_loss"], label="val_loss")
plt.title("Loss on Training Set")
plt.xlabel("Epoch #")
plt.ylabel("Loss")
plt.legend(loc="lower left")
plt.savefig('RegressionPlot.png')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.