Keras实践笔记11——使用简易深度神经网络识别EnglishFnt数据集

Stella981
• 阅读 563

有了前面的积累,我们可以开始用一些实际的例子结合着Keras提供的Example进行学习了,后续的例子会使用EnglishFnt这个印刷体数据集进行训练和识别,这个数据集里面存放了从0-9的数字和A-Z的英文字符。

Keras实践笔记11——使用简易深度神经网络识别EnglishFnt数据集 Keras实践笔记11——使用简易深度神经网络识别EnglishFnt数据集

比起手写字符集MNIST,EnglishFnt长得还是很中规中矩的。 为了不需要后续每次都重新加载一次数据做预处理,接下来先把这个数据集处理下,变成npy存起来

    def loadEnglishFntData(self):
        labels = []
        datasets = []
        base_path = '../datasets/English/Fnt'
        train_dir = os.listdir(base_path)
        train_dir.sort()
        for dir in train_dir:
            if dir.startswith('.'):
                continue

            print('处理文件夹:[%s]' % dir)
            for root, dirs, files in os.walk(os.path.join(base_path, dir)):
                for file in files:
                    if dir.startswith('.'):
                        continue
                    img = cv2.imread(os.path.join(root, file), cv2.COLOR_BGR2GRAY)
                    img = cv2.resize(img, (28, 28), interpolation=cv2.INTER_CUBIC)
                    labels.append(dir)
                    datasets.append(img)

        datasets = np.array(datasets)
        labels = np.array(labels)

        # 处理数据集
        datasets = datasets.astype('float32')

        # 数据归一化
        datasets /= 255
        datasets = datasets.reshape(datasets.shape[0], 28, 28, 1)

        prepare_labels = []
        for obj in labels:
            prepare_labels.append(int(re.sub("\D", "", obj)) - 1)

        labels = keras.utils.to_categorical(prepare_labels, 62)
        return datasets, labels

这里把图片数据转成了28*28的代销,归一化后塞到了datasets里面,至于labels,我们按照文件夹的名称把数字做成了label,然后再借助了keras的to_categorical 把一维数组拉成了二维数组,接着保存下

dataloader = DataLoader()
datasets, labels = dataloader.loadEnglishFntData()
np.save('fnt_datasets.npy', datasets)
np.save('fnt_labels.npy', labels)

接下来就可以开始训练了,先试一下双层DNN训练的效果

import numpy as np
from keras import Sequential
from keras.callbacks import TensorBoard
from keras.layers import Dense, Dropout, Flatten
from keras.optimizers import RMSprop

X_Train = np.load('../fnt_datasets.npy')
Y_Train = np.load('../fnt_labels.npy')

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=X_Train.shape[1:]))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(62, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])
model.fit(X_Train, Y_Train,
          batch_size=128,
          epochs=10,
          verbose=1,
          validation_split=0.3,
          callbacks=[TensorBoard(log_dir='./logs', histogram_freq=1)])
model.save('./model.h5')

接下来加载训练好的模型来进行检验,实验图片我们用着三张数字图片进行

import cv2
import keras
import numpy as np

model = keras.models.load_model('./model.h5')
img = cv2.imread('../datasets/22.png', cv2.IMREAD_GRAYSCALE)
img_resize = cv2.resize(img, (28, 28), interpolation=cv2.INTER_CUBIC)
result = model.predict(img_resize.reshape(1, 28, 28, 1))
print(np.argmax(result))

不得不说两层建议的DNN训练10次,效果还是挺不好的....,那我们再做个小实验,用训练出来的模型重新跑一会训练的数据集咧?随手挑一个

import os

import cv2
import keras
import numpy as np

model = keras.models.load_model('./model.h5')

success = 0
failed = 0

for root, dirs, files in os.walk('../../../datasets/English/Fnt/Sample006'):
    for file in files:
        print(file)
        img = cv2.imread(os.path.join(root, file), cv2.COLOR_BGR2GRAY)
        img = cv2.resize(img, (28, 28), interpolation=cv2.INTER_CUBIC)
        result = model.predict(img.reshape(1, 28, 28, 1))
        if np.argmax(result) == 5:
            success += 1
        else:
            failed += 1
print(success)
print(failed)

成功判断出92个,判断失败了924个.....这简直没法用啊,哈哈哈。PS:用MacBookPro来炼丹真是挺费劲的...两层简易的DNN,一个epoch要跑200s=。=

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
AI研习丨针对长尾数据分布的深度视觉识别
  !(http://dingyue.ws.126.net/2020/0812/714a3e94j00qey3su000xd000q100dup.jpg)  摘要  本文介绍了目前国内外关于长尾数据分布下深度视觉识别的研究进展,主要从常用数据集及应用、经典机器学习解决方案和深度学习解决方案三个维度进行梳理和分析,并针对长尾数据分布的
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这