首页 > 解决方案 > 损失和准确性无法提高

问题描述

我试图用大约 100,000 个训练图像和 10,000 个测试图像来训练一个产品检测模型。但是,无论我在模型中使用什么优化器,我都尝试过 Adam、SGD 和多种学习率,我的损失和准确率并没有提高。下面是我的代码

首先,我阅读了火车图像

for x in train_data.category.tolist():
    if x < 10:
        x = "0" + str(x)
        path = os.path.join(train_DATADIR,x)
    else:
        x = str(x)
        path = os.path.join(train_DATADIR,x)
    img_array = cv2.imread(os.path.join(path,str(train_data.filename[idx])), cv2.IMREAD_GRAYSCALE)
    new_array = cv2.resize(img_array,(100,100))
    train_images.append(new_array) 
    idx += 1
    print(f'{idx}/105392 - {(idx/105392)*100:.2f}%')
narray = np.array(train_images)

然后我将 train_images 数据保存到二进制文件中

np.save(DIR_PATH + 'train_images_bitmap.npy', narray)

然后我将 train_images 除以 255.0

train_images = train_images / 255.0

并用 100x100 的输入节点声明我的模型,因为图像被调整为 100x100

model = keras.Sequential([
keras.layers.Flatten(input_shape=(100, 100)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(42)
])

然后我编译模型,我尝试了 adam, SGD(lr=0.01 up to 0.2 and as low to 0.001)

model.compile(optimizer='adam',
          loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
          metrics=['accuracy'])

接下来我用时代的回调来拟合模型

model.fit(train_images, train_labels,epochs=2000)
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,monitor='val_acc',
mode='max',save_best_only=True, save_weights_only=True, verbose=1)

但是我在这个时代得到的输出并没有提高,我该如何提高损失和准确性?下面是时代的输出

Epoch 6/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7210 - accuracy: 0.0249
Epoch 7/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7210 - accuracy: 0.0248
Epoch 8/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7209 - accuracy: 0.0255
Epoch 9/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7209 - accuracy: 0.0251
Epoch 10/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7210 - accuracy: 0.0254
Epoch 11/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7209 - accuracy: 0.0254
Epoch 12/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7210 - accuracy: 0.0243
Epoch 13/2000
3294/3294 [==============================] - 12s 3ms/step - loss: 3.7210 - accuracy: 0.0238
Epoch 14/2000
3294/3294 [==============================] - 11s 3ms/step - loss: 3.7210 - accuracy: 0.0251
Epoch 15/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7209 - accuracy: 0.0253
Epoch 16/2000
3294/3294 [==============================] - 11s 3ms/step - loss: 3.7210 - accuracy: 0.0243
Epoch 17/2000
3294/3294 [==============================] - 12s 4ms/step - loss: 3.7210 - accuracy: 0.0247
Epoch 18/2000
3294/3294 [==============================] - 12s 3ms/step - loss: 3.7210 - accuracy: 0.0247

标签: pythontensorflowkeras

解决方案


我不认为优化器的选择是主要问题。在这件事上只有一点经验,我只能提出一些建议:

  • 对于图像,我会尝试在密集层之前使用 2d 卷积层。
  • 尝试添加一个 dropout 层以减少过度拟合的可能性。
  • 第一层是 100*100,减少到 128 可能是激进(我不知道,但这至少是我的直觉)尝试从 128 增加到更大的数字,甚至添加一个中间层 :)

也许是这样的:

    模型=顺序()
    model.add(Conv2D(...))
    model.add(MaxPooling2D(...)
    model.add(辍学(...))
    model.add(展平(...))
    模型.add(密集(...))
    模型.编译(...)```

推荐阅读