Keras 卷积回归模型,预测始终相同的值

问题描述 投票:0回答:1

目标是计算图像中较大圆圈与较小圆圈的比例。所以我希望模型返回一个浮点数。

数据集包括:

  • 16K 张图像,每张图像都包含 2 个比另一个大的圆圈。

  • 具有更大圆圈数据的 CSV,在本例中为文件名和
    比例。

问题: 该模型预测始终相同的值。

我尝试过的:

  • 标准化0和1之间的比例。
  • 使用其他方法加载数据集。
  • 不同的优化器和学习率

代码:

train_dir = '../train/circles/'
test_dir = '../test/circles/'

IMG_SIZE = 250
BATCH_SIZE = 32

data_df = pd.read_csv('../data/circles_big.csv')
train_df = data_df[data_df['Variant'] == 'Train']
test_df = data_df[data_df['Variant'] == 'Test']

train_df = train_df[['Proportion', 'Filename']]
test_df = test_df[['Proportion', 'Filename']]

gen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)

train_generator = gen.flow_from_dataframe(
    dataframe=train_df,
    directory=train_dir,
    x_col='Filename',
    y_col='Proportion',
    target_size=(IMG_SIZE, IMG_SIZE),
    class_mode='raw',
    batch_size=BATCH_SIZE,
    shuffle=True
)

test_generator = gen.flow_from_dataframe(
    dataframe=test_df,
    directory=test_dir,
    x_col='Filename',
    y_col='Proportion',
    target_size=(IMG_SIZE, IMG_SIZE),
    class_mode='raw',
    batch_size=BATCH_SIZE,
    shuffle=True
)

inputs = keras.Input(shape=(IMG_SIZE, IMG_SIZE, 3))
x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Flatten()(x)
x = layers.Dense(512, activation="relu")(x)
outputs = layers.Dense(1)(x) 

model = keras.Model(inputs=inputs, outputs=outputs)

model.compile(loss="mse", optimizer="adam", metrics=["mae"])

history = model.fit(train_generator, epochs=10, batch_size=32, verbose=1)

训练输出(我已经训练了 50 个 epoch,但没有摆脱 72.000 损失):

344/344 [==============================] - 63s 161ms/step - loss: 73.8999 - mae: 3.7510
Epoch 2/10
344/344 [==============================] - 54s 156ms/step - loss: 72.5437 - mae: 3.7838
Epoch 3/10
344/344 [==============================] - 53s 153ms/step - loss: 72.3242 - mae: 3.7979
Epoch 4/10
344/344 [==============================] - 53s 153ms/step - loss: 72.3054 - mae: 3.7828
Epoch 5/10
344/344 [==============================] - 54s 158ms/step - loss: 72.2541 - mae: 3.7986
Epoch 6/10
344/344 [==============================] - 54s 157ms/step - loss: 72.3650 - mae: 3.7947
Epoch 7/10
344/344 [==============================] - 53s 155ms/step - loss: 72.2549 - mae: 3.7982
Epoch 8/10
344/344 [==============================] - 55s 159ms/step - loss: 72.2433 - mae: 3.7906
Epoch 9/10
344/344 [==============================] - 54s 158ms/step - loss: 72.2253 - mae: 3.8048
Epoch 10/10
344/344 [==============================] - 53s 154ms/step - loss: 72.2451 - mae: 3.7841

现在我的问题是为什么预测总是相同的?即使模型训练得不够,它不应该给出不同的预测值吗?

test_data = next(test_generator)
predictions = model.predict(test_data[0])  
true_value = test_data[1]

for i in range(len(predictions)):
    print(f"Predicted: {predictions[i][0]:}, True Value: {true_value[i]:}")

输出:

1/1 [==============================] - 0s 33ms/step
Predicted: 3.8054518699645996, True Value: 1.448
Predicted: 3.8054518699645996, True Value: 1.063
Predicted: 3.8054518699645996, True Value: 6.06
Predicted: 3.8054518699645996, True Value: 1.058
Predicted: 3.8054518699645996, True Value: 2.826
Predicted: 3.8054518699645996, True Value: 3.188
Predicted: 3.8054518699645996, True Value: 4.437
Predicted: 3.8054518699645996, True Value: 1.983
Predicted: 3.8054518699645996, True Value: 2.213
...
python machine-learning keras deep-learning conv-neural-network
1个回答
0
投票

实施似乎正在发挥作用。我尝试了相同的代码,但这次使用圆形区域(只有一个圆圈的图像)而不是比例。不同之处在于我的面积均匀分布,而我的比例则不然。

© www.soinside.com 2019 - 2024. All rights reserved.