• 【Tensorflow生成minist手写图像以及解决遇到的问题】


    哈哈哈哈哈,两年没有写博客了
    本科学的硬件,现在考上研究生了,在学习计算机视觉,所以你们问我的以前我写的那些博客的问题我几乎是回答不上来了,哈哈哈哈哈哈哈,自己解决吧
    现在是从头开始学习GAN
    以后会好好记录现在的学习生活的
    这周用tensorflow实现了一个手写minist数据集,这算是计算机视觉中基础的基础吧,但是运行出来的时候我也很开心,毕竟都是自己一步一步去解决的问题
    代码参考的是

    https://github.com/lzx1019056432/Tensorflow-mnist

    我本来以为的是我可以直接用这里的代码运行一次,因为我只是想看一下他的实现效果,会生成哪些文件夹,但是也出现了一些问题
    这是他的源码

    import numpy as np
    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    #获取mnist里面的数据,并返回一个DataSet实例,下载数据存储到《minist_data目录下》
    mnist = input_data.read_data_sets('mnist_data',one_hot=True)
    #占位符 类型是浮点型 形状是二维,这里的none表示第一个维度可以是任意长度
    input_x = tf.compat.v1.placeholder(tf.float32,[None,28*28],name='input_x')
    #输出的值呢 为 一个二维的,onehot形式的
    output_y = tf.compat.v1.placeholder(tf.int32,[None,10],name='output_y')
    #logits_output = tf.compat.v1.placeholder(tf.int32,[None,10],name='logit_output')
    #-1表示不考虑输入图片的数量
    image = tf.reshape(input_x,[-1,28,28,1])#改变形状之后的输入
    #取测试图片和标签
    test_x = mnist.test.images[:3000]
    test_y = mnist.test.labels[:3000]
    
    #第一层卷积
    conv1 = tf.layers.conv2d(inputs=image,#输入
            filters=32,#32个过滤器
            kernel_size=[5,5],#过滤器在二维的大小是5*5
            strides=1,#步长是1
            padding='same',#same表示输出的大小不变,因此需要补零
            activation=tf.nn.relu#激活函数
     )#形状[28,28,32]
    print(conv1.shape)
    #第二层 池化
    pool1 = tf.layers.max_pooling2d(
            inputs=conv1,#第一层卷积后的值
            pool_size=[2,2],#过滤器二维大小2*2
            strides=2   #步长2
    )#形状[14,14,32]
    #第三层  卷积2
    conv2 = tf.layers.conv2d(inputs=pool1,
            filters=64,
            kernel_size=[5,5],
            strides=1,
            padding='same',
            activation=tf.nn.relu
    )#形状[14,14,64]
    #第四层 池化2
    pool2 = tf.layers.max_pooling2d(
            inputs=conv2,
            pool_size=[2,2],
            strides=2
    )#形状[7,7,64]
    #平坦化
    print(pool2.shape,'pool2的shape')
    flat = tf.reshape(pool2,[-1,7*7*64])
    print(flat.shape,'flat shape')
    #1024个神经元的全连接层
    dense = tf.layers.dense(inputs=flat,units=1024,activation=tf.nn.relu)
    print(dense.shape)
    #Dropout 丢弃百分之50
    #dropout = tf.layers.dropout(inputs=dense,rate=0.5)
    #输出 形状是[1,1,10],10个神经元的全连接层
    dense2 = tf.layers.dense(inputs=dense,units=512,name="dense2")
    logits = tf.layers.dense(inputs=dense2,units=10,name="logit_1")
    
    #计算误差,使用交叉熵(交叉熵用来衡量真实值和预测值的相似性)
    loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits)
    #学习率0.001 最小化loss值,adam优化器
    train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
    #精度 计算预测值和实际标签的匹配程度
    #tf.argmax:返回张量轴上具有最大值的索引,axis=0是按列来说,axis=1 是按行来
    #返回(accuracy,update_op) 前者是截止到上一个batch为止的准确值,后者为更新本批次的准确度
    accuracy = tf.metrics.accuracy(
                labels=tf.argmax(output_y,axis=1),
                predictions=tf.argmax(logits,axis=1),)[1]
    tf.add_to_collection('logits',logits)
    tf.add_to_collection('accuracy',accuracy)
    sess = tf.compat.v1.Session()#创建一个会话
    #初始化全局变量和局部变量
    
    init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
    sess.run(init)
    #Writer = tf.summary.FileWriter('./log')
    #Writer.add_graph(sess.graph)
    for i in range(200):
        #获取以batch_size为大小的一个元组,包含一组图片和标签
        batch = mnist.train.next_batch(50)
        train_loss,train_op_,logits_output = sess.run([loss,train_op,logits],{input_x:batch[0],output_y:batch[1]})
        if i % 100 == 0:
            test_accuracy = sess.run(accuracy,{input_x:test_x,output_y:test_y})
            print(("step=%d,Train loss=%.4f,[Test accuracy=%.2f]") \
                    % (i, train_loss, test_accuracy))
    
    #测试
    test_output = sess.run(logits,{input_x:test_x[1:2]})
    inferenced_y = np.argmax(test_output,1)
    print(test_output,'test_out')
    print(inferenced_y,'Inferenced numbers')#推测的数据
    print(np.argmax(test_y[1:2],1),'Real numbers')
    test_x[:2]
    saver = tf.compat.v1.train.Saver()#保存模型方法一
    saver.save(sess,"./model/model",global_step=200)#保存模型方法一
    #builder = tf.saved_model.builder.SavedModelBuilder('check_path_mnist')#保存模型方法二
    #builder.add_meta_graph_and_variables(sess,['predict_mnist'])#保存模型方法二
    #builder.save()#保存模型方法二
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98

    说一下我遇到的问题,按道理来说这里的源码确实是可以用tensorflow1运行的,但是我安装的是tensorflow2版本,所以就遇到了问题

    from tensorflow.examples.tutorials.mnist import input_data
    
    • 1

    这句代码实现的是自动下载minist数据集,但是我的报错是找不到examples文件,我是在miniconda上创建的tensorflow虚拟环境,我参考的是这一篇博客

    https://blog.csdn.net/xiguangyong/article/details/114409988?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166729526016800180661745%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166729526016800180661745&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-114409988-null-null.142v62pc_search_tree,201v3control_2,213v1control&utm_term=from%20tensorflow.examples.tutorials.mnist%20import%20input_data&spm=1018.2226.3001.4187

    一定要找对路径!!!!我的路径是
    在这里插入图片描述
    一定是在环境里面找!!!如果没有tensorflow_core文件也没有关系,直接将example解压到tensorflow文件夹是一样的
    在这里插入图片描述
    解压过后要重新打开python,不要直接就认为是可以了,“重启”对于程序员来说,懂的都懂!!!
    遇到的第二个问题是

    import tensorflow as tf
    
    • 1

    因为我用的tensorflow2,所以其实很多报错都是这个原因引起的
    在这里插入图片描述
    解决办法是,将

    import tensorflow as tf
    
    • 1

    替换为

    import tensorflow._api.v2.compat.v1 as tf
    tf.disable_v2_behavior()
    
    • 1
    • 2

    因为刚开始不知道是版本的问题,所以我是一个一个去解决的,在解决placeholder不能使用时,我在定义前面添加了一行

    tf.compat.v1.disable_eager_execution()
    
    • 1

    不知道这一行代码有没有用,哈哈哈哈哈,反正加了就先记录一下,敲代码嘛,随意就好
    最后我的代码是

    import numpy as np
    import tensorflow._api.v2.compat.v1 as tf
    tf.disable_v2_behavior()
    from tensorflow.examples.tutorials.mnist import input_data
    # 获取mnist里面的数据,并返回一个DataSet实例,下载数据存储到《minist_data目录下》
    mnist = input_data.read_data_sets('mnist_data',one_hot=True)
    # 占位符 类型是浮点型 形状是二维,这里的none表示第一个维度可以是任意长度
    tf.compat.v1.disable_eager_execution()
    input_x = tf.compat.v1.placeholder(tf.float32,[None,28*28],name='input_x')
    # 输出的值呢 为 一个二维的,onehot形式的
    output_y = tf.compat.v1.placeholder(tf.int32,[None,10],name='output_y')
    # logits_output = tf.compat.v1.placeholder(tf.int32,[None,10],name='logit_output')
    # -1表示不考虑输入图片的数量
    image = tf.reshape(input_x,[-1,28,28,1])
    # 改变形状之后的输入
    # 取测试图片和标签
    test_x = mnist.test.images[:3000]
    test_y = mnist.test.labels[:3000]
    
    # 第一层卷积
    conv1 = tf.layers.conv2d(inputs=image,
            filters=32,
            kernel_size=[5,5],
            strides=1,
            padding='same',
            activation=tf.nn.relu
     )
    # 形状[28,28,32]
    print(conv1.shape)
    # 第二层 池化
    pool1 = tf.layers.max_pooling2d(
            inputs=conv1,
            pool_size=[2,2],
            strides=2
    )
    # 形状[14,14,32]
    # 第三层  卷积2
    conv2 = tf.layers.conv2d(inputs=pool1,
            filters=64,
            kernel_size=[5,5],
            strides=1,
            padding='same',
            activation=tf.nn.relu
    )
    # 形状[14,14,64]
    # 第四层 池化2
    pool2 = tf.layers.max_pooling2d(
            inputs=conv2,
            pool_size=[2,2],
            strides=2
    )
    # 形状[7,7,64]
    # 平坦化
    print(pool2.shape,'pool2的shape')
    flat = tf.reshape(pool2,[-1,7*7*64])
    print(flat.shape,'flat shape')
    # 1024个神经元的全连接层
    dense = tf.layers.dense(inputs=flat,units=1024,activation=tf.nn.relu)
    print(dense.shape)
    # Dropout 丢弃百分之50
    # dropout = tf.layers.dropout(inputs=dense,rate=0.5)
    # 输出 形状是[1,1,10],10个神经元的全连接层
    dense2 = tf.layers.dense(inputs=dense,units=512,name="dense2")
    logits = tf.layers.dense(inputs=dense2,units=10,name="logit_1")
    
    # 计算误差,使用交叉熵(交叉熵用来衡量真实值和预测值的相似性)
    loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits)
    # 学习率0.001 最小化loss值,adam优化器
    train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
    # 精度 计算预测值和实际标签的匹配程度
    # tf.argmax:返回张量轴上具有最大值的索引,axis=0是按列来说,axis=1 是按行来
    # 返回(accuracy,update_op) 前者是截止到上一个batch为止的准确值,后者为更新本批次的准确度
    accuracy = tf.metrics.accuracy(
                labels=tf.argmax(output_y,axis=1),
                predictions=tf.argmax(logits,axis=1),)[1]
    tf.add_to_collection('logits',logits)
    tf.add_to_collection('accuracy',accuracy)
    sess = tf.compat.v1.Session()
    # 创建一个会话
    # 初始化全局变量和局部变量
    
    init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
    sess.run(init)
    # Writer = tf.summary.FileWriter('./log')
    # Writer.add_graph(sess.graph)
    for i in range(200):
        # 获取以batch_size为大小的一个元组,包含一组图片和标签
        batch = mnist.train.next_batch(50)
        train_loss,train_op_,logits_output = sess.run([loss,train_op,logits],{input_x:batch[0],output_y:batch[1]})
        if i % 100 == 0:
            test_accuracy = sess.run(accuracy,{input_x:test_x,output_y:test_y})
            print(("step=%d,Train loss=%.4f,[Test accuracy=%.2f]") \
                    % (i, train_loss, test_accuracy))
    
    # 测试
    test_output = sess.run(logits,{input_x:test_x[1:2]})
    inferenced_y = np.argmax(test_output,1)
    print(test_output,'test_out')
    print(inferenced_y,'Inferenced numbers')#推测的数据
    print(np.argmax(test_y[1:2],1),'Real numbers')
    test_x[:2]
    saver = tf.compat.v1.train.Saver()#保存模型方法一
    saver.save(sess,"./model/model",global_step=200)#保存模型方法一
    # builder = tf.saved_model.builder.SavedModelBuilder('check_path_mnist')#保存模型方法二
    # builder.add_meta_graph_and_variables(sess,['predict_mnist'])#保存模型方法二
    # builder.save()#保存模型方法二
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108

    运行效果是
    在这里插入图片描述
    文件发生的变化是
    在这里插入图片描述

    minist是代码运行后下载的数据集,model是运行后保存的文件

    其实我对敲代码还挺感兴趣的,就是遇到问题然后一个一个去解决,去梳理,我喜欢这样的过程。不急,慢慢来。研究生生活,好好加油!!!!

  • 相关阅读:
    Java File分隔符和 Path分隔符
    终于搞懂了 super(XXXX, self).__init__()的作用是啥了
    平面上最接近点对(分治法)
    STA学习记录4-输入输出路径约束
    前端技术面试核心问题(持续更新)
    Selenium自动化测试框架
    【21天学习挑战赛】二分查找题目之寻找峰值
    【牛客刷题专栏】0x32:JZ45 把数组排成最小的数(C语言编程题)
    十八、CANdelaStudio深入-Data Types
    码神之路项目总结(一)
  • 原文地址:https://blog.csdn.net/weixin_44906810/article/details/127646872