解析在注释里:
1 import tensorflow as tf 2 from tensorflow.examples.tutorials.mnist import input_data 3 import os 4 os.environ["CUDA_VISIBLE_DEVICES"]="0" 5 mnist = input_data.read_data_sets("./data/MNIST_data/", one_hot=True) 6 learning_rate=0.01 7 training_epochs=25 8 batch_size=100 #一次训练所选取的样本数。 9 display_step=1 10 11 if __name__ =='__main__': 12 x=tf.placeholder(tf.float32,[None,784]) 13 y=tf.placeholder(tf.float32,[None,10]) 14 15 print("PPPPPP") 16 batch_xs, batch_ys = mnist.train.next_batch(batch_size) 17 print(batch_xs.shape) 18 print("LLLLLLLLLLLL") 19 print(batch_ys.shape) 20 21 '''Variable 初始化''' 22 W=tf.Variable(tf.zeros([784,10])) 23 b=tf.Variable(tf.zeros([10])) 24 25 '''逻辑回归模型''' 26 pred=tf.nn.softmax(tf.matmul(x,W)+b) 27 28 '''构造代价函数''' 29 ''' 30 tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。 31 reduce_mean(input_tensor, 32 输入的待降维的tensor 33 axis=None, 34 指定的轴,如果不指定,则计算所有元素的均值 35 keep_dims=False, 36 是否降维度 37 name=None, 38 操作的名称 39 reduction_indices=None 40 用来指定轴 41 ) 42 ''' 43 cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=1)) 44 45 '''梯度下降最小值''' 46 optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 47 48 init = tf.global_variables_initializer() 49 with tf.Session() as sess: 50 sess.run(init) 51 52 '''训练模型''' 53 for epoch in range(training_epochs): 54 avg_cost = 0 55 total_batch = int(mnist.train.num_examples / batch_size) 56 for i in range(total_batch): 57 batch_xs, batch_ys = mnist.train.next_batch(batch_size) 58 _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys}) 59 # Conpute average loss 60 avg_cost += c / total_batch 61 if (epoch + 1) % display_step == 0: 62 print("第:", '%04d步' % (epoch + 1), "标准差:", "{:.09f}".format(avg_cost)) 63 64 65 '''测试模型''' 66 ''' 67 argmax(f(x))是使得 f(x)取得最大值所对应的变量点x(或x的集合) 68 test = np.array([ 69 [1, 2, 3], 70 [2, 3, 4], 71 [5, 4, 3], 72 [8, 7, 2]]) 73 np.argmax(test, 0) #输出:array([3, 3, 1] 74 np.argmax(test, 1) #输出:array([2, 2, 0, 0] 75 76 axis = 0: 77 axis=0时比较每一列的元素,将每一列最大元素所在的索引记录下来,最后输出每一列最大元素所在的索引数组。 78 axis = 1: 79 axis=1的时候,将每一行最大元素所在的索引记录下来,最后返回每一行最大元素所在的索引数组。 80 ''' 81 correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) 82 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 83 print("准确的:", accuracy.eval({x: mnist.test.images[:3000], y: mnist.test.labels[:3000]}))