博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符是识别---11--源数据20*20--训练样本0~Z----基于TensorFlow+CNN实现
阅读量:4298 次
发布时间:2019-05-27

本文共 6479 字,大约阅读时间需要 21 分钟。

 

#coding=utf-8import os#图像读取库from PIL import Image#矩阵运算库import numpy as npimport tensorflow as tf# 训练还是测试train = True #True False# 数据文件夹if train:    data_dir = "data"else:    data_dir = "test"# 模型文件路径model_path = "model/image_model"# 从文件夹读取图片和标签到numpy数组中# 标签信息在文件名中,例如1_40.jpg表示该图片的标签为1def read_data(data_dir):    datas = []    labels = []    fpaths = []    for fname in os.listdir(data_dir):        fpath = os.path.join(data_dir, fname)        fpaths.append(fpath)        image = Image.open(fpath)        print(fpath)        data = np.array(image) / 255.0        label = int(fname.split("_")[0])        #label = fname.split("_")[0]        datas.append(data)        labels.append(label)    datas = np.array(datas)    labels = np.array(labels)    print("shape of datas: {}\tshape of labels: {}".format(datas.shape, labels.shape))    return fpaths, datas, labelsfpaths, datas, labels = read_data(data_dir)# 计算有多少类图片num_classes = len(set(labels))# 定义Placeholder,存放输入和标签datas_placeholder = tf.placeholder(tf.float32, [None, 20, 20, 3])labels_placeholder = tf.placeholder(tf.int32, [None])# 存放DropOut参数的容器,训练时为0.25,测试时为0dropout_placeholdr = tf.placeholder(tf.float32)# 定义卷积层, 20个卷积核, 卷积核大小为5,用Relu激活conv0 = tf.layers.conv2d(datas_placeholder, 20, 5, activation=tf.nn.relu)# 定义max-pooling层,pooling窗口为2x2,步长为2x2pool0 = tf.layers.max_pooling2d(conv0, [2, 2], [2, 2])# 定义卷积层, 40个卷积核, 卷积核大小为4,用Relu激活conv1 = tf.layers.conv2d(pool0, 40, 4, activation=tf.nn.relu)# 定义max-pooling层,pooling窗口为2x2,步长为2x2pool1 = tf.layers.max_pooling2d(conv1, [2, 2], [2, 2])# 将3维特征转换为1维向量flatten = tf.layers.flatten(pool1)# 全连接层,转换为长度为100的特征向量fc = tf.layers.dense(flatten, 400, activation=tf.nn.relu)# 加上DropOut,防止过拟合dropout_fc = tf.layers.dropout(fc, dropout_placeholdr)# 未激活的输出层logits = tf.layers.dense(dropout_fc, num_classes)predicted_labels = tf.arg_max(logits, 1)# 利用交叉熵定义损失losses = tf.nn.softmax_cross_entropy_with_logits(    labels=tf.one_hot(labels_placeholder, num_classes),    logits=logits)# 平均损失mean_loss = tf.reduce_mean(losses)# 定义优化器,指定要优化的损失函数optimizer = tf.train.AdamOptimizer(learning_rate=1e-2).minimize(losses)# 用于保存和载入模型saver = tf.train.Saver()with tf.Session() as sess:    if train:        print("训练模式")        # 如果是训练,初始化参数        sess.run(tf.global_variables_initializer())        # 定义输入和Label以填充容器,训练时dropout为0.25        train_feed_dict = {            datas_placeholder: datas,            labels_placeholder: labels,            dropout_placeholdr: 0.25        }        for step in range(300):#150            _, mean_loss_val = sess.run([optimizer, mean_loss], feed_dict=train_feed_dict)            if step % 10 == 0:                print("step = {}\tmean loss = {}".format(step, mean_loss_val))        saver.save(sess, model_path)        print("训练结束,保存模型到{}".format(model_path))    else:        print("测试模式")        # 如果是测试,载入参数        saver.restore(sess, model_path)        print("从{}载入模型".format(model_path))        # label和名称的对照关系        label_name_dict = {            0: "0",            1: "1",            2: "2",            3: "3",            4: "4",            5: "5",            6: "6",            7: "7",            8: "8",            9: "9",            10: "A",            11: "B",            12: "C",            13: "D",            14: "E",            15: "F",            16: "G",            17: "H",            18: "I",            19: "J",            20: "K",            21: "L",            22: "M",            23: "N",            24: "P",            25: "Q",            26: "R",            27: "S",            28: "T",            29: "U",            30: "V",            31: "W",            32: "X",            33: "Y",            34: "Z"        }        # 定义输入和Label以填充容器,测试时dropout为0        test_feed_dict = {            datas_placeholder: datas,            labels_placeholder: labels,            dropout_placeholdr: 0        }        predicted_labels_val = sess.run(predicted_labels, feed_dict=test_feed_dict)        len = predicted_labels_val.shape[0]        num = 0        # 真实label与模型预测label        for fpath, real_label, predicted_label in zip(fpaths, labels, predicted_labels_val):            # 将label id转换为label名            real_label_name = label_name_dict[real_label]            predicted_label_name = label_name_dict[predicted_label]            print("{}\t{} => {}".format(fpath, real_label_name, predicted_label_name))            if real_label == predicted_label:                num = num + 1                print("正确")            else:                print("错误***************************************************************************")        print("正确率:{}% ,总个数:{},判断正确个数:{}".format(num / len * 100, len, num))

 

2019-06-26 15:58:18.709062: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.

测试模式
从model/image_model载入模型
test\0_1.jpg    0 => D
错误***************************************************************************
test\10_2.jpg    A => 1
错误***************************************************************************
test\11_0.jpg    B => B
正确
test\12_0.jpg    C => C
正确
test\13_0.jpg    D => D
正确
test\14_0.jpg    E => E
正确
test\15_0.jpg    F => E
错误***************************************************************************
test\16_0.jpg    G => G
正确
test\17_0.jpg    H => H
正确
test\18_0.jpg    I => I
正确
test\19_0.jpg    J => 2
错误***************************************************************************
test\1_0.jpg    1 => 1
正确
test\20_1.jpg    K => K
正确
test\21_0.jpg    L => L
正确
test\22_0.jpg    M => H
错误***************************************************************************
test\22_1.jpg    M => F
错误***************************************************************************
test\23_0.jpg    N => W
错误***************************************************************************
test\24_0.jpg    P => P
正确
test\25_0.jpg    Q => Q
正确
test\26_0.jpg    R => F
错误***************************************************************************
test\27_0.jpg    S => S
正确
test\28_0.jpg    T => T
正确
test\29_0.jpg    U => U
正确
test\2_1.jpg    2 => 2
正确
test\30_0.jpg    V => W
错误***************************************************************************
test\31_0.jpg    W => W
正确
test\32_0.jpg    X => X
正确
test\33_0.jpg    Y => Y
正确
test\34_0.jpg    Z => Z
正确
test\3_5.jpg    3 => 3
正确
test\4_0.jpg    4 => 4
正确
test\4_17.jpg    4 => 4
正确
test\5_2.jpg    5 => 5
正确
test\6_1.jpg    6 => 6
正确
test\7_1.jpg    7 => 7
正确
test\8_2.jpg    8 => 8
正确
test\8_4.jpg    8 => 8
正确
test\9_12.jpg    9 => 9
正确
正确率:76.31578947368422% ,总个数:38,判断正确个数:29

 

 

转载地址:http://hlsws.baihongyu.com/

你可能感兴趣的文章
ES相关度评分
查看>>
我们一起做一个可以商用的springboot脚手架
查看>>
idea在搭建ssm框架时mybatis整合问题 无法找到mapper
查看>>
java设计基本原则----单一职责原则
查看>>
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
linux安装docker
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>
工作流中文乱码问题解决
查看>>
maven打包本地依赖包
查看>>