如何用更少的数据做出更好的建模?

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

我正在研究使用较少数据进行建模,这是深度学习中最大的问题之一。所以我学会了一些处理它的东西。该模型总是过度拟合。我学会了数据增强。

数据

train_dir = r"C:\Users\haytr\OneDrive\Masaüstü\yemekler\train"
test_dir = r"C:\Users\haytr\OneDrive\Masaüstü\yemekler\test"

train_data = ImageDataGenerator(rescale = 1./255,
                               rotation_range = 40,
                               width_shift_range = 0.2,
                               height_shift_range = 0.2,
                               shear_range = 0.2,
                               zoom_range = 0.2,
                               horizontal_flip = True,
                               fill_mode = 'nearest')

test_data = ImageDataGenerator(rescale = 1./255)

train_data = train_data.flow_from_directory(train_dir,
                                            target_size = (128, 128),
                                            batch_size = 50,
                                            class_mode = 'categorical')

test_data = test_data.flow_from_directory(test_dir,
                                          target_size = (128, 128),
                                          batch_size = 50,
                                          class_mode = 'categorical')
Found 2500 images belonging to 10 classes.
Found 750 images belonging to 10 classes.

train_data
中每个文件有 250 张关于食物的图像,
test_data
中每个文件有 75 张图像。

这个方法解决了我的过拟合问题。

型号

model = Sequential()
model.add(layers.Conv2D(filters = 16, kernel_size = (3, 3), activation = 'relu', input_shape = (128, 128, 3)))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(filters = 32, kernel_size = (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(filters = 64, kernel_size = (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(filters = 128, kernel_size = (3, 3), activation = 'relu'))

model.add(layers.Flatten())

model.add(layers.Dense(128, activation = 'relu'))
model.add(layers.Dense(10, activation = 'softmax'))



model.compile(loss = tf.keras.losses.CategoricalCrossentropy(),
              optimizer = tf.keras.optimizers.Adam(),
              metrics = ["accuracy"])


model.fit(train_data, validation_data = test_data, epochs = 10)

培训

Epoch 1/10
50/50 [==============================] - 14s 261ms/step - loss: 2.2492 - accuracy: 0.1688 - val_loss: 2.1461 - val_accuracy: 0.2133
Epoch 2/10
50/50 [==============================] - 13s 262ms/step - loss: 2.1402 - accuracy: 0.2096 - val_loss: 2.0766 - val_accuracy: 0.2427
Epoch 3/10
50/50 [==============================] - 13s 262ms/step - loss: 2.0728 - accuracy: 0.2488 - val_loss: 2.0440 - val_accuracy: 0.2747
Epoch 4/10
50/50 [==============================] - 13s 264ms/step - loss: 2.0270 - accuracy: 0.2692 - val_loss: 2.0222 - val_accuracy: 0.2707
Epoch 5/10
50/50 [==============================] - 13s 258ms/step - loss: 1.9880 - accuracy: 0.2828 - val_loss: 1.9479 - val_accuracy: 0.3187
Epoch 6/10
50/50 [==============================] - 13s 258ms/step - loss: 1.9160 - accuracy: 0.3332 - val_loss: 1.9857 - val_accuracy: 0.3080
Epoch 7/10
50/50 [==============================] - 13s 264ms/step - loss: 1.8774 - accuracy: 0.3420 - val_loss: 1.9064 - val_accuracy: 0.3253
Epoch 8/10
50/50 [==============================] - 13s 257ms/step - loss: 1.8684 - accuracy: 0.3396 - val_loss: 1.8923 - val_accuracy: 0.3173
Epoch 9/10
50/50 [==============================] - 13s 261ms/step - loss: 1.8192 - accuracy: 0.3564 - val_loss: 1.9205 - val_accuracy: 0.3227
Epoch 10/10
50/50 [==============================] - 13s 260ms/step - loss: 1.7873 - accuracy: 0.3788 - val_loss: 1.8581 - val_accuracy: 0.3493

模型评估

model.evaluate(train_data)
50/50 [==============================] - 12s 228ms/step - loss: 1.7583 - accuracy: 0.4016
[1.7583075761795044, 0.4016000032424927]


model.evaluate(test_data)
15/15 [==============================] - 2s 114ms/step - loss: 1.8581 - accuracy: 0.3493
[1.858059048652649, 0.34933334589004517]

正如你所见。我做了很多 hiperparameters 调整。我尝试了很多 epoch 组合,但在 5-6 个 epoch 后,准确率再次通过 val_accuracy 并且过度拟合。

那么我的建模中是否有错误的东西,或者是神经网络的所有能力都具有小数据。如何做出更好的建模? (顺便说一句,我知道迁移学习是小数据的强大解决方案,但我只是要求我的模型。)

我尝试了数据增强和超参数调整。

deep-learning computer-vision
© www.soinside.com 2019 - 2024. All rights reserved.