损失和准确性无法提高

时间:2020-06-29 08:55:54

标签: python tensorflow keras

我正在尝试使用大约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最高为0.2,最低为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

1 个答案:

答案 0 :(得分:0)

我不认为选择优化器是主要问题。仅凭一点经验,我只能提出一些建议:

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

也许是这样的:

    model = Sequential()
    model.add(Conv2D(...))
    model.add(MaxPooling2D(...)
    model.add(Dropout(...))
    model.add(Flatten(...))
    model.add(Dense(...))
    model.compile(...)```