基本使用( 二 )


#加载库'''如果某个版本中出现了某个新的功能特性,而且这个特性和当前版本中使用的不兼容,也就是它在该版本中不是语言标准,那么我如果想要使用的话就需要从future模块导入 。'''from __future__ importprint_functionimport tensorflow as tffrom tensorflow.examples.tutorials.mnist importinput_data'''建模顺序导入库和数据创建会话窗口定义placehould变量,xs(图像) , ys(真实的lable) ,dropout定义函数:权重,偏置,卷积,池化执行,卷积池化,卷积池化,全连接,定义dropout,全连接softmax定义交叉熵和优化器全局变量初始化,激活图训练测试精确度'''#加载0~10的数据mnist = input_data.read_data_sets( 'MNIST_data', one_hot=True )'''提前定义一个图通过它,你可以更加灵活地构建你的代码 。它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的 。'''#定义运行变量sess = tf.InteractiveSession()'''这里我们会应用多层的卷积网络来构建softmax回归模型 。虽然placeholder的shape参数是可选的,但有了它,TensorFlow能够自动捕捉因数据维度不一致导致的错误 。None表示其值大小不定,在这里作为第一个维度值,用以指代batch的大小'''#定义变量开辟内存空间xs = tf.placeholder( tf.float32, [None, 784] )/255. #28*28ys = tf.placeholder( tf.float32, [None, 10 ])dropout = tf.placeholder( tf.float32 )#定义一个tensor'''函数的作用是将tensor变换为参数shape形式,其中的shape为一个列表形式,特殊的是列表可以实现逆序的遍历即list(-1).-1所代表的含义是我们不用亲自去指定这一维的大小,函数会自动进行计算,但是列表中只能存在一个-1 。(如果存在多个-1,就是一个存在多解的方程) 只有reshape形式下才可以进行卷积池化???'''x_image = tf.reshape(xs, [-1, 28, 28, 1])#输入reshape28*28图片数量, 图片高度, 图片宽度, 图像通道数]#辅助函数 计算精度def compute_accuracy( v_xs, v_ys ):global prediction#Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global 。y_pre = sess.run(prediction, feed_dict={ xs:v_xs, dropout:1 } )#预测#这里的run是为了执行外面global的函数correct_prediction = tf.equal( tf.argmax( y_pre, 1 ), tf.argmax(v_ys, 1 ) )#比较预测和真实值accuracy = tf.reduce_mean( tf.cast( correct_prediction, tf.float32 ) )#转换类型result = sess.run( accuracy, feed_dict={ xs:v_xs, ys:v_ys, dropout:1 } ) #这里的run是为了执行本函数returnresult#**************************************函数定义 *****************************************#定义权重函数'''这里的weight相当于卷积核,将卷积核里面的参数初始化为正太分布的0.1 。stddev(正太分布的标准差)'''def weight_variable(shape):initial = tf.truncated_normal(shape, stddev=0.1 )#正态分布在0.1之间 #最后返回一个sizereturn tf.Variable(initial)#定义偏置函数def bias_variable(shape):initial = tf.constant( 0.1, shape= shape )#定义一个参数0.1作为最开始的偏置return tf.Variable(initial)#定义卷积函数def conv2d(x,W):return tf.nn.conv2d( x,W, strides=[1,1,1,1] , padding='SAME')#定义最大池化函数def max_pool_2x2(x):return tf.nn.max_pool( x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME' )#ksize=[1,2,2,1]的前后两位都是1,因为我们不想在batch和channels上做池化,所以这两个维度设为了1#LeNet5 卷积+池化+卷积+池化+拉直+全连接层(隐层)+全连接层(输出层)#**************************************深度学习部分 *****************************************#第1次:卷积+池化W_conv1 = weight_variable( [5,5,1,32]) #卷积核大小5*5,输入通道数量1, 卷积核的数量32[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数]b_conv1 = bias_variable( [32] )#32个偏置,32个输出的神经元h_conv1 = tf.nn.relu( conv2d( x_image,W_conv1) + b_conv1 ) #输入图像28*28, 输出通道32个print('卷积',h_conv1)h_pool1 = max_pool_2x2(h_conv1)#池化后,输出图像14*14, 输出通道32个,输出特征图28*28print(h_pool1)#第2次:卷积+池化W_conv2 = weight_variable( [5,5,32,64] ) #卷积核大小5*5, 输入通道32个,卷积核数量64个b_conv2 = bias_variable( [64] )#偏置数量=该层神经元数量 = 64h_conv2 = tf.nn.relu( conv2d( h_pool1, W_conv2) + b_conv2 ) #输入特征图14*14, 64个特征图 平面print(h_conv2)h_pool2 = max_pool_2x2( h_conv2 )#池化后,输出特征图7*7, 64个特征图print(h_pool2)#拉直h_pool2_flat = tf.reshape(h_pool2,[-1, 7*7*64])#第1次:全连接层(隐层)W_fc1 = weight_variable( [7*7*64,1024] ) #输入变量7*7*64,输出1024个变量b_fc1 = bias_variable( [1024] )#偏置数量= 该层神经元数量 = 1024h_fc1 = tf.nn.relu( tf.matmul( h_pool2_flat, W_fc1 ) + b_fc1 ) # 输出神经元数量1024,一维向量 直线'''keep_prob: float类型,每个元素被保留下来的概率,设置神经元被选中的概率,在初始化时keep_prob是一个占位符, keep_prob = tf.placeholder(tf.float32)。tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5'''h_fc1_drop = tf.nn.dropout( h_fc1, dropout )#第2次:全连接层(输出层)W_fc2 = weight_variable( [1024,10] ) #输入1024变(神经元)量, 输出10个变量b_fc2 = bias_variable( [10] )#偏置数量 = 该层神经元数量 = 10prediction = tf.nn.softmax( tf.matmul( h_fc1_drop , W_fc2 ) + b_fc2 )#整个网络最后输出#误差:采用交叉熵,损失函数(评价标准=用于训练)'''交叉熵例子:正确答案((1,0,0),预测(0.5,0.4,0.1))= -(1*log0.5+0*log0.4+0*log0.1)≈0.3tf.reduce_sum:计算总和#reduction_indices[1] 会输出【1,2】这样的两个结果tf.reduce_sum:计算张量的各个维度上的元素的平均值.:比如x = [[2,2,4],[2,2,4]] #(2+2+4)*2 /6'''cross_entropy = tf.reduce_mean( -tf.reduce_sum( ys*tf.log(prediction), reduction_indices=[1] ) )#训练'''设置优化器,定义优化交叉熵'''trian_step = tf.train.AdamOptimizer( 1e-4 ).minimize(cross_entropy)init = tf.global_variables_initializer()sess.run(init)#训练300次for i in range(1000):batch_xs, batch_ys = mnist.train.next_batch(100)sess.run(trian_step,feed_dict={ xs:batch_xs, ys:batch_ys, dropout:0.5 } )if i % 50 == 0:print('训练loss:',sess.run(cross_entropy,feed_dict={xs:batch_xs,ys:batch_ys,dropout : 1}))if i % 50 == 0:print( "测试准确度:",i, compute_accuracy(mnist.test.images[:1000], mnist.test.labels[:1000]) )