python - 损失和准确性无法提高
问题描述
我试图用大约 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
解决方案
我不认为优化器的选择是主要问题。在这件事上只有一点经验,我只能提出一些建议:
- 对于图像,我会尝试在密集层之前使用 2d 卷积层。
- 尝试添加一个 dropout 层以减少过度拟合的可能性。
- 第一层是 100*100,减少到 128 可能是激进(我不知道,但这至少是我的直觉)尝试从 128 增加到更大的数字,甚至添加一个中间层 :)
也许是这样的:
模型=顺序() model.add(Conv2D(...)) model.add(MaxPooling2D(...) model.add(辍学(...)) model.add(展平(...)) 模型.add(密集(...)) 模型.编译(...)```
推荐阅读
- javascript - Array.reduce() 按对象字段分组并将所有其他字段扩展到其相应的分组对象字段
- jasper-reports - 如果数值介于两个数字之间,如何显示消息?
- java - JAXB。如何使用 JAXB 解析 XML 在 POJO 类中填充内部类/列表?
- c++ - 在交叉编译器目录中运行 .build.sh 文件时出错
- swift - 使用 swift 处理通过 cordova 插件中的 FCM APNs 接口收到的消息
- javascript - 如何在 JavaScript 中使用 Google Map 填充输入字段后填充纬度和经度
- python - 如何在csv文件中创建一个循环?
- laravel - 如何在 Laravel 模型中使用具有 belongsToMany 关系的范围方法
- java - 一个 Java 独立应用程序在 Oracle Solaris 11.4 操作系统中执行需要更多时间,而在 Red Hat Linux 服务器中执行时间减少 3 倍
- javascript - 通过带有输入字段的嵌套 ul/li 结构过滤,如果输入为空则重置为原始状态