zoukankan      html  css  js  c++  java
  • tensorflow神经网络与单层手写字识别

    1、知识点

    """
    1、基础知识:
        1、神经网络结构:1、输入层    2、隐含层   3、全连接层(类别个数=全连接层神经元个数)+softmax函数  4、输出层
        2、逻辑回归:只能解决二分类问题
        3、线性回归:只能用于预测
        4、softmax:有多少类别,就会有多少个输出
        5、信息熵:信息熵越大,不确定性越大,信息熵越小,则不确定小,属于的类别也更加清晰
        6、softmax公式: Si = e^i / (e^1+....+e^j) ,用于计算概率值。 特点:所有类别概率值相加等于1
        7、损失函数:交叉熵损失 ,一个样本就有一个交叉熵损失。公式: H(y) = -y'log y(i)对i的求和值,其中y'为真实结果,y(i)为预测结果,一
    
    2、感知机:有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出
        应用场景:很容易解决与、或、非问题,即二分类问题
    
    3、神经网络的种类:
        1、基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等
        2、进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经网络等
        3、深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等
    
    4、神经网络特点:
        1、输入向量的维度和输入神经元的个数相同
        2、每个连接都有个权值
        3、同一层神经元之间没有连接
        4、由输入层,隐层,输出层组成
        5、第N层与第N-1层的所有神经元连接,也叫全连接
    
    5、神经网络API模块:
        1、tf.nn:提供神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation.
        2、tf.layers:主要提供的高层的神经网络,主要和卷积相关的,对tf.nn进一步封装。
        3、tf.contrib:tf.contrib.layers提供将计算图中的网络层、正则化、摘要操作,是构建计算图的高级操作,但是tf.contrib包不稳定以及一些实验代码
    
    算法对比总结:
        算法          策略          优化
    线性回归        均方误差        梯度下降    预测
    逻辑回归        对数似然损失    梯度下降     二分类
    神经网络        交叉熵损失      反响传播算法(就是梯度下降算法)
    
    单层(全连接层)实现手写数字识别:
        1、定义数据占位符,针对特征值和目标值矩阵
            特征值[None,784] 目标值[None,10]
        2、建立模型
            随机初始化权重和偏置   y_predict = tf.matmul(x,w)+b
        3、计算损失
            loss平均样本损失(交叉熵损失)
        4、梯度下降优化(梯度下降算法)
    """

    2、代码

    # coding = utf-8
    import  tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    
    FLAGS = tf.app.flags.FLAGS
    tf.app.flags.DEFINE_integer("IS_TRAIN",1,"指定程序是预测还是训练")
    def fullconnnected():
        """
        全连接层
        :return:
    
        """
        #获取数据
        minist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)
    
        # 1、建立数据占位符 x[None,784]  y_true[None,10]
        with tf.variable_scope("data"):
            x = tf.placeholder(tf.float32,[None,784])
            y_true = tf.placeholder(tf.int32,[None,10])
        #2、建立一个全连接层的神经网络
        with tf.variable_scope("fc_model"):
            #随机初始化权重和偏置
            weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="w")
            bias = tf.Variable(tf.constant(0.0,shape=[10]))
    
            #预测None个样本的输出结果
            y_predict = tf.matmul(x,weight)+bias
    
        #3、计算交叉熵损失
        with tf.variable_scope("cross_entropy"):
            #求取平均交叉熵损失
            loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))
    
        #4、梯度下降求出损失
        with tf.variable_scope("optimizer"):
            train_op = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
    
        #5、计算准确率
        with tf.variable_scope("accuracy"):
            equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
            #equal_list  None个样本 [1,0,1,1,0,0,0......]
            accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))
    
        #6、收集变量
        tf.summary.scalar("losses",loss)
        tf.summary.scalar("acc",accuracy)
        tf.summary.histogram("weights",weight)
        tf.summary.histogram("baises",bias)
        merge = tf.summary.merge_all()
    
        #7、初始化变量
        init_op = tf.global_variables_initializer()
    
        #8、创建一个Saver
        saver = tf.train.Saver()
    
        #9、开启会话进行训练
        with tf.Session() as sess:
            #初始化变量
            sess.run(init_op)
            fileWriter = tf.summary.FileWriter("./event/",graph=sess.graph)
    
    
            if FLAGS.IS_TRAIN == 1:
                #迭代步数训练,更新参数预测
                for i in range(2000):
                    #取出数据的特征自和目标值
                    mnist_x,mnist_y =minist.train.next_batch(50)
                    #训练
                    sess.run(train_op,feed_dict={x: mnist_x, y_true:mnist_y})
                    summary = sess.run(merge,feed_dict={x: mnist_x, y_true:mnist_y})
                    fileWriter.add_summary(summary,i)
                    print("训练第%d步,准确率为:%f" %(i,sess.run(accuracy,feed_dict={x: mnist_x, y_true:mnist_y})) )
                #保存模型
                saver.save(sess,"./ckpt/fc_model")
            else:
                #如果是0,那么做预测
                for i in range(10):
                    saver.restore(sess,"./ckpt/fc_model")
                    #每次测试一张图片
                    x_test,y_test = minist.test.next_batch(1)
                    print("第%d张图片,手写数字是%d,,预测结果是%d" %(
                        i,
                        tf.argmax(y_test,1).eval(),
                        tf.argmax(sess.run(y_predict,feed_dict={x: x_test, y_true:y_test}),1).eval()
                    ))
        return None
    
    
    if __name__ == '__main__':
        "测试:python 简单神经网络介绍.py --IS_TRAIN=0"
        #默认训练
        fullconnnected()
        pass
  • 相关阅读:
    最近吸收的html && CSS 知识
    Visual C++ 20111021
    递归变位数(练习)
    effective C++ 第五章
    二叉树的非递归遍历
    插入排序补充
    数的乘方,简单背包,组合
    在这个病毒猖獗的年代……
    元宵夜游城隍庙
    Cherish your work
  • 原文地址:https://www.cnblogs.com/ywjfx/p/10933747.html
Copyright © 2011-2022 走看看