python - val_accuracy 不会改变。总是完全相同的值
问题描述
所以我的 CNN 模型的 val_accuracy 没有改变。事实上 is 总是相同的值。我有六个班级,每个班级有 190 个样本。总共约。1250 个样本。正常损失减少,但非常缓慢。这可能与我的样本太少有关吗?
结构如下:
X_train, X_test, y_train, y_test = train_test_split(final, y, test_size=0.25, random_state=42, stratify=y)
X_train = tf.expand_dims(X_train, axis=-1)
X_test = tf.expand_dims(X_test, axis=-1)
num_classes = 6
# convert class vectors to binary class matrices - this is for use in the
# categorical_crossentropy loss below
y_train = keras.utils.np_utils.to_categorical(y_train-1, num_classes)
y_test = keras.utils.np_utils.to_categorical(y_test-1, num_classes)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 400, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(num_classes, activation='softmax'))
opt = SGD(learning_rate=0.0000001)
model.compile(loss = "categorical_crossentropy", optimizer = opt, metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=200, validation_data=(X_test, y_test), batch_size=4, shuffle=True)
输出如下所示:
Epoch 1/200
213/213 [==============================] - 13s 63ms/step - loss: 31.1534 - accuracy: 0.1529 - val_loss: 49.1441 - val_accuracy: 0.1690
Epoch 2/200
213/213 [==============================] - 13s 62ms/step - loss: 28.5760 - accuracy: 0.1741 - val_loss: 25.3026 - val_accuracy: 0.1690
Epoch 30/200
213/213 [==============================] - 13s 62ms/step - loss: 13.4533 - accuracy: 0.1835 - val_loss: 24.9576 - val_accuracy: 0.1690
Epoch 31/200
213/213 [==============================] - 13s 62ms/step - loss: 13.2200 - accuracy: 0.1671 - val_loss: 27.3058 - val_accuracy: 0.1690
Epoch 105/200
213/213 [==============================] - 13s 62ms/step - loss: 5.3484 - accuracy: 0.1518 - val_loss: 5.4915 - val_accuracy: 0.1690
Epoch 106/200
213/213 [==============================] - 13s 62ms/step - loss: 5.1911 - accuracy: 0.1706 - val_loss: 7.9073 - val_accuracy: 0.1690
我尝试了以下方法: - 将 Adam 优化器更改为 SGD
- 降低/改变学习率
- 减少批量大小
-Shuffe=真
还有什么想法吗?
解决方案
根据我的经验,我认为每个班级有 190 个样本,其中 6 个班级应该给出合理的结果,尽管更多的样本总是更好。根据分类的性质,您的模型可能不够深,因此请考虑添加另一层或两层卷积和池化。一件事是您的学习率非常低,为 0.0000001。首先尝试使用 0.001 的学习率。如果性能没有提高,则向模型添加层。除非您的图像非常大,否则我还会考虑将批量大小增加到 30,这对于 224 X 224 之类的图像来说已经足够了。如果这些东西不起作用,您可以尝试使用下面的代码为您的模型进行迁移学习
model_name='EfficientNetB3'
base_model=tf.keras.applications.EfficientNetB3(include_top=False, weights="imagenet",input_shape=img_shape, pooling='max')
x=base_model.output
x=keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001 )(x)
x = Dense(256, kernel_regularizer = regularizers.l2(l = 0.016),activity_regularizer=regularizers.l1(0.006),
bias_regularizer=regularizers.l1(0.006) ,activation='relu')(x)
x=Dropout(rate=.45, seed=123)(x)
output=Dense(class_count, activation='softmax')(x)
model=Model(inputs=base_model.input, outputs=output)
model.compile(Adamax(lr=.001), loss='categorical_crossentropy', metrics=['accuracy'])
注意 EfficientNet 模型需要像素值在 0 到 255 范围内的图像,因此您不必缩放图像。顺便说一句,您是否在代码中缩放了图像,即 img=img/255?
推荐阅读
- java - 如何将数据从属性对象保存到文件 + 如何将属性格式的文件加载到另一个方法中的属性对象?
- mysql - 跟踪存在
- robotframework - 如何使用机器人框架处理边缘浏览器的“您的连接不是私有的”
- javascript - 错误地将日期时间转换为角度与矩库中的角度
- javascript - 机器人是否可以为消息随机化 2 种颜色?
- git - 是否可以在 git config 中设置多个用户电子邮件?
- c++ - 如何将回调传递给 C++ 的 EM_ASM?
- python-3.x - 使用两个不同的脚本在串口中读写
- .net - Angular 路由器发送 GET 请求而不是加载组件
- java - 字符串格式在邮件发送中不起作用