• TensorFlow初识(MNIST数据集识别手写体)


    github博客传送门
    csdn博客传送门
    TensorFlow初识(MNIST数据集识别手写体)

    第一步 导包

    import tensorflow as tf
    import numpy as np
    # 这里使用tensorflow框架自带的识别手写体的数据集
    import tensorflow.examples.tutorials.mnist.input_data as input_data  # 导入下载数据集手写体
    mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)       # 下载数据集
    

    第二步 搭建神经网络框架

    # 创建神经网络类 定义一个全链接
    class MLPNet:
        # 初始化参数
        def __init__(self):
            pass
        
        # 正向传播
        def forward(self):
            pass
        
        # 反向传播
        def backward(self):
            pass
    
    # 创建主函数入口
    if __name__ == '__main__':
        net = MLPNet()  # 实例化对象
        net.forward()   # 调用forward(正向传播)方法
        net.backward()  # 调用backward(反向传播)方法
        init = tf.global_Variables_initializert()  # 初始化所有tensorflow变量的命令
        with tf.Session() as sess:  # 创建一个会话
            sess.run(init)  # 调用执行图 init里的命令
    

    第三步 补全初始化参数 正向传播 反向传播

    def __init__(self):
        # 定义一个占位 数据类型 tf.float32 数据形状是 [None, 3] 列是784,行不确定 使用时传参
        self.x = tf.placeholder(dtype=tf.float32, shape=[None, 784])  # 输入样本 x (图片)
        # 定义一个占位 数据类型 tf.float32 数据形状是 [None, 3] 列是10,行不确定 使用时传参
        self.y = tf.placeholder(dtype=tf.float32, shape=[None, 10])  # 输入标签 y (人为标注的one_hot标签)
        # 定义一个伪随机的输入层变量 服从正态分布 数据形状是 784, 100为神经元个数视情况而定 stddev是标准偏差 一般设置为 神经元个数的 sqrt(1/神经元个数) 
        self.in_w = tf.Variable(tf.truncated_normal(shape=[784, 100], stddev=tf.sqrt(1/100)))  # 输入 w
        # 定义一个输入层变量 偏值 b 里面的值为 zeros 个数为 神经元个数
        self.in_b = tf.Variable(tf.zeros([100]))
        # 定义一个输出层的变量 w  变量的值设置为 正态分布的随机值 数据的形状是 100行 ,10列 stddev是标准偏差 一般设置为 神经元个数的 sqrt(1/神经元个数)
        self.out_w = tf.Variable(tf.truncated_normal(shape=[100, 10], stddev=0.1))
        # 定义一个输出层的变量 b  变量的值设置为 神经元个数的 zeros值
        self.out_b = tf.Variable(tf.zeros([10]))
    
    def forward(self):
        # tf.nn.relu(表示relu激活函数) tf.layers.batch_normalization(对数据进行归一化) tf.matmul(乘法表示 self.x * self.in_w)
        self.fc1 = tf.nn.relu(tf.layers.batch_normalization(tf.matmul(self.x, self.in_w)+self.in_b))  # 求 h=wx+b 中 h的值 然后归一化 使用 tf.nn.relu 激活函数 求出 σ(h) 得出 y冒 的 期望值
        # tf.nn.softmax(表示softmax分类器) tf.matmul(表示将self.fc1 * self.out_w相乘)
        self.output = tf.nn.softmax(tf.matmul(self.fc1, self.out_w)+self.out_b)  # 将求出的
    
    def backward(self):
        # 求出 损失  预测值 和 标签值的误差的平方的均值
        self.loss = tf.reduce_mean((self.output-self.y)**2)
        # 优化器  设置训练速率 0.1 tf.train.GradientDescentOptimizer(0.1)(梯度下降优化器, 学习速率0.1) .minimize将损失反向传回去 做权重调整  opt返回很多参数 例:loss 
        self.opt = tf.train.GradientDescentOptimizer(0.1).minimize(self.loss)
    

    第四步 补全主函数的训练

    # 创建主函数入口
    if __name__ == '__main__':
        net = MLPNet()  # 实例化对象
        net.forward()   # 调用forward(正向传播)方法
        net.backward()  # 调用backward(反向传播)方法
        init = tf.global_Variables_initializert()  # 初始化所有tensorflow变量的命令
        with tf.Session() as sess:  # 创建一个会话
            sess.run(init)  # 调用执行图 init里的命令 初始化所有tensorflow变量
            for epoch in range(100000):  # 设置训练的次数
                xs, ys = mnist.train.next_batch(100)  # 从mnist数据集中取样本train的方法 netx_batch(100)每个批次取100张 这是minist数据集中的取图片的内置方法
                # sess.run() tensorflow执行语句  net.output(返回的结果)多个用[列表装起来 逗号隔开] feed_dict={net.x (实例化对象的self.x) : xs, net.y (实例化对象的self.y) : ys)}
                _loss, _ = sess.run([net.loss, net.opt], feed_dict = {net.x:xs, net.y:ys})  # 必须传 net.opt 因为 self.opt里面 调用了 tensorflow里面的 梯度下降法的优化器 所以必须用 sess.run()方法运行一遍
    

    第五步 写测试集

    # 创建主函数入口
    if __name__ == '__main__':
        net = MLPNet()  # 实例化对象
        net.forward()   # 调用forward(正向传播)方法
        net.backward()  # 调用backward(反向传播)方法
        init = tf.global_Variables_initializert()  # 初始化所有tensorflow变量的命令
        with tf.Session() as sess:  # 创建一个会话
            sess.run(init)  # 调用执行图 init里的命令
            for epoch in range(100000):  # 设置训练次数 循环次数
                xs, ys = mnist.train.next_batch(100)  # 从mnist数据集中取样本train的方法 netx_batch(100)每个批次取100张 这是minist数据集中的取图片的内置方法
                _loss, _ = sess.run([net.loss, net.opt], feed_dict = {net.x: xs, net.y: ys})
                if epoch % 100 = 0:  # 判断循环 100次的时候 将测试集放入训练后的模型 进行测试 看识别准确率
                    test_xs, test_ys = mnist.test.next_batch(10000)  # 将测试集的10000张图的数据 和 标签取出来
                    test_output = sess.run(net.output, feed_dict = {net.x: test_xs})  # 将 测试集的 数据 传给 实例化的 net.x / self.x  然后获取 输出net.output
                    
                    test_y = np.argmax(test_ys, axis=1)  # 求 标签集 每行的 最大值的下标 (one_hot码) 相当于 返回 0,1,2,3,4,5,6,7,8,9 中的其中一个下标
                    test_out = np.argmax(test_output, axis=1)  # 将 返回的 output 进行求 每行最大值的下标 
                    print(np.mean(np.array(test_y == test_out, dtype=np.float32)))  # 将 标签的下标 和 输出的下标 进行对比 然后求平均值 算出准确率
    
    

    全部代码综合

    import tensorflow as tf
    import numpy as np
    # 这里使用tensorflow框架自带的识别手写体的数据集
    import tensorflow.examples.tutorials.mnist.input_data as input_data  # 导入下载数据集手写体
    mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)       # 下载数据集
    
    # 创建神经网络类 定义一个全链接
    class MLPNet:
        def __init__(self):
            # 定义一个占位 数据类型 tf.float32 数据形状是 [None, 3] 列是784,行不确定 使用时传参
            self.x = tf.placeholder(dtype=tf.float32, shape=[None, 784])  # 输入样本 x (图片)
            # 定义一个占位 数据类型 tf.float32 数据形状是 [None, 3] 列是10,行不确定 使用时传参
            self.y = tf.placeholder(dtype=tf.float32, shape=[None, 10])  # 输入标签 y (人为标注的one_hot标签)
            # 定义一个伪随机的输入层变量 服从正态分布 数据形状是 784, 100为神经元个数视情况而定 stddev是标准偏差 一般设置为 神经元个数的 sqrt(1/神经元个数) 
            self.in_w = tf.Variable(tf.truncated_normal(shape=[784, 100], stddev=tf.sqrt(1/100)))  # 输入 w
            # 定义一个输入层变量 偏值 b 里面的值为 zeros 个数为 神经元个数
            self.in_b = tf.Variable(tf.zeros([100]))
            # 定义一个输出层的变量 w  变量的值设置为 正态分布的随机值 数据的形状是 100行 ,10列 stddev是标准偏差 一般设置为 神经元个数的 sqrt(1/神经元个数)
            self.out_w = tf.Variable(tf.truncated_normal(shape=[100, 10], stddev=0.1))
            # 定义一个输出层的变量 b  变量的值设置为 神经元个数的 zeros值
            self.out_b = tf.Variable(tf.zeros([10]))
    
        def forward(self):
            # tf.nn.relu(表示relu激活函数) tf.layers.batch_normalization(对数据进行归一化) tf.matmul(乘法表示 self.x * self.in_w)
            self.fc1 = tf.nn.relu(tf.layers.batch_normalization(tf.matmul(self.x, self.in_w)+self.in_b))  # 求 h=wx+b 中 h的值 然后归一化 使用 tf.nn.relu 激活函数 求出 σ(h) 得出 y冒 的 期望值
            # tf.nn.softmax(表示softmax分类器) tf.matmul(表示将self.fc1 * self.out_w相乘)
            self.output = tf.nn.softmax(tf.matmul(self.fc1, self.out_w)+self.out_b)  # 将求出的
    
        def backward(self):
            # 求出 损失  预测值 和 标签值的误差的平方的均值
            self.loss = tf.reduce_mean((self.output-self.y)**2)
            # 优化器  设置训练速率 0.1 tf.train.GradientDescentOptimizer(0.1)(梯度下降优化器, 学习速率0.1) .minimize将损失反向传回去 做权重调整  opt返回很多参数 例:loss 
            self.opt = tf.train.GradientDescentOptimizer(0.1).minimize(self.loss)
    
    
    # 创建主函数入口
    if __name__ == '__main__':
        net = MLPNet()  # 实例化对象
        net.forward()   # 调用forward(正向传播)方法
        net.backward()  # 调用backward(反向传播)方法
        init = tf.global_Variables_initializert()  # 初始化所有tensorflow变量的命令
        with tf.Session() as sess:  # 创建一个会话
            sess.run(init)  # 调用执行图 init里的命令
            for epoch in range(100000):  # 设置训练次数 循环次数
                xs, ys = mnist.train.next_batch(100)  # 从mnist数据集中取样本train的方法 netx_batch(100)每个批次取100张 这是minist数据集中的取图片的内置方法
                _loss, _ = sess.run([net.loss, net.opt], feed_dict = {net.x: xs, net.y: ys})
                if epoch % 100 = 0:  # 判断循环 100次的时候 将测试集放入训练后的模型 进行测试 看识别准确率
                    test_xs, test_ys = mnist.test.next_batch(10000)  # 将测试集的10000张图的数据 和 标签取出来
                    test_output = sess.run(net.output, feed_dict = {net.x: test_xs})  # 将 测试集的 数据 传给 实例化的 net.x / self.x  然后获取 输出net.output
                    
                    test_y = np.argmax(test_ys, axis=1)  # 求 标签集 每行的 最大值的下标 (one_hot码) 相当于 返回 0,1,2,3,4,5,6,7,8,9 中的其中一个下标
                    test_out = np.argmax(test_output, axis=1)  # 将 返回的 output 进行求 每行最大值的下标 
                    print(np.mean(np.array(test_y == test_out, dtype=np.float32)))  # 将 标签的下标 和 输出的下标 进行对比 然后求平均值 算出准确率
    
  • 相关阅读:
    散列表
    5月19日
    5月17日阅读笔记3
    5月15日 阅读笔记2
    5月14日 阅读笔记1
    团队5
    团队博客2
    团队博客4
    团队博客3
    团队博客1
  • 原文地址:https://www.cnblogs.com/Mrzhang3389/p/9790955.html
Copyright © 2020-2023  润新知