python - 字符识别结果不佳
问题描述
我正在尝试从图像中读取六位数字。我使用 tensorflow/keras 进行训练。这是我为此提出的模型:
model = Sequential()
model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(50, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(500, activation="relu"))
model.add(Dense(10, activation="softmax"))
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=40, epochs=30, verbose=1)
我采集了 97,000 多个样本,其中 30% 用于测试。训练结束后:
如您所见,样本上的结果非常好,但是当我使用相同的样本进行测试时,几乎每 10 个项目都会得到一个错误的结果。
我匹配了训练和测试样本,它们都是一样的。这是预处理部分:
letter_image = img_number[y: y + h, x: x + w]
letter_image = cv2.copyMakeBorder(letter_image, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=(255, 255, 255))
letter_image = cv2.cvtColor(letter_image, cv2.COLOR_BGR2GRAY)
letter_image = helper.resize_to_fit(letter_image, 20, 20)
raw = letter_image
letter_image = np.expand_dims(letter_image, axis=2)
letter_image = np.expand_dims(letter_image, axis=0)
prediction = cheque_number_model.predict(letter_image)
letter = cheque_number_label.inverse_transform(prediction)[0]
我会非常感谢任何建议。谢谢,也对不起我的英语。
解决方案
我认为您应该考虑以下几点来提高准确性。
- 尝试增加训练测试拆分。
- 您在 Conv2D 中添加的图层的形状非常小,为 5x5,而您的输入为 20x20。想想你在做什么,你实际上是在裁剪或忽略数据的重要特征。
- 当您继续添加新层时,形状保持不变,但神经元的数量正在增加,这是荒谬的。
- 还要考虑一下最大池对您的输入形状有什么影响。
请查看这 4 点并进行相应的更改。你会看到进步。请回复我的结果。
推荐阅读
- c# - xamarin 形式的单元测试 API 调用
- c# - MSDeploy 在远程服务器上部署 c# 控制台应用程序
- c# - 带有消息中心的 Xamarin 多个条目
- android - 获取调用上下文的父上下文
- python - 如何在 django 视图中设置 forms.ChoiceField 的值?
- google-cloud-platform - 无法激活“DV360 卖家 API”。一直提示“权限不足,无法查看该产品的启用状态”。
- java - 如何访问此 Java 对象中的这些属性
- python - 从 webscraper 清理表数据
- sql - 如何确定 T-SQL 中每周的工作时间总和?
- spring - 是否有更改返回像 response.png 而不是 response.bin 的 png 文件