目标是计算图像中较大圆圈与较小圆圈的比例。所以我希望模型返回一个浮点数。
数据集包括:
16K 张图像,每张图像都包含 2 个比另一个大的圆圈。
具有更大圆圈数据的 CSV,在本例中为文件名和
比例。
问题: 该模型预测始终相同的值。
我尝试过的:
代码:
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
...
实施似乎正在发挥作用。我尝试了相同的代码,但这次使用圆形区域(只有一个圆圈的图像)而不是比例。不同之处在于我的面积均匀分布,而我的比例则不然。