第一次开始接触tensorflow,据说这个工具很强大,封装了很多算法,而且只需要设计正向传播函数,逆向传播框架自己会求,在学习神经网络上很方便和快捷。下面介绍我的第一个tensorflow程序。以及tensorflow常见的函数:
1、constant、Variable、placeholder、initialize_all_variables、Session、run、assign、feed_dict
常量 、变量 、占位符、 初始化、 会话、 运行、 变量赋值、 占位符传参
#coding:utf-8 import tensorflow as tf a=tf.constant(10) #常量 b=tf.constant(20) c=tf.add(a,b) with tf.Session() as sess: print(sess.run(c)) ############################## a=tf.Variable(10) #变量,需要初始化init b=tf.Variable(20) c=tf.add(a,b) init=tf.initialize_all_variables() with tf.Session() as sess: sess.run(init) print(sess.run(c)) ################################# a=tf.placeholder(tf.float32) #占位符 b=tf.placeholder(tf.float32) c=tf.add(a,b) with tf.Session() as sess: ans=sess.run(c,feed_dict={a:10,b:20}) print(ans) ##################################### a=tf.placeholder(tf.int32) #如何赋值?类似形参使用 b=tf.Variable(10) #可以变 c=tf.constant(20) #不能变 with tf.Session() as sess: sess.run(tf.initialize_all_variables()) x=sess.run(b) #先读出来 print(sess.run(a,feed_dict={a:x})) #传参 b=tf.assign(b,x*2) #修改变量值 print(sess.run(b))
2、用tensorflow实现softmax(学习率和每次填充集有关,遇到了NAN错误)
①本来想手写softmax来实现Mnist数据集的分类,但是数据集太大,电脑跑不动,就用tensorflow来快速实现一下。
②tf有多强大呢?首先只需要设计正向传播,并且有读取Mnist数据集的模块,其次还能够随机填充测试集大小,实现标签和测试集的绑定,可以一次填充一张图片,一次填充所有图片,一次填充100张图片,这个填充量和学习率要对应合适。
③具体实现:(数据下载 ,下载的数据放在当前目录下的MNIST_data文件夹下)
import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) x = tf.placeholder(tf.float32, [None, 784]) W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) #行向量 y = tf.nn.softmax(tf.matmul(x,W) + b) y_ = tf.placeholder("float", [None,10]) #代价函数 y = tf.clip_by_value(y, 1e-10, 1.0) #防止出现nan错误 cross_entropy = -tf.reduce_sum(y_*tf.log(y)) #学习率 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) init = tf.initialize_all_variables() #开始训练,前面都是预处理 sess = tf.Session() sess.run(init) #迭代 for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) #为什么是100?不一定是100,只要学习率和这个值对应合适即可 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) if i%100==0: print(sess.run(cross_entropy, feed_dict={x: batch_xs, y_: batch_ys})) #预测 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) #输出 print (sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) print (sess.run(accuracy, feed_dict={x: mnist.train.images, y_: mnist.train.labels})
④为什么nan错误(概率很小时,log后变成无穷大)
⑤为什么修改填充集,反而效果更差,填充集扩大,学习率就要减小
这里的学习率参数是0.01,如果将next_batch(100)中的100增大,比如1000,神经网络很容易“走火入魔”的学习出一个准确度只有9.8%的结果。如果将学习率减小到0.001。那么结果就很容易i比较稳定的达到90%以上了。我感觉可以用一个比喻来说明这个现象:1、有个人性子比较急,你给他一点儿事情做,他很快做完,你再给他一些,他又很快做完。如此反复很多次。做得多学得多,很快成了专家。2、你没注意到这个人性子很急,你给他很多事情做,这个人疯了。3、有个人慢性子,做事情特别小心谨慎。放心吧,你给他一堆事情,他慢慢都给你做好了。最后也成了专家。
3、python的文件读写
①可以使用np.save和np.read来保存和读取程序运行过程中产生的参数,但是保存格式为npy,不可见,打开后是乱码
②python读取文本(只能是处理字符串)
with open("",'w') as f: #填入路径 f.write("我爱你") #如果要写入的数据不是字符串类型,需要转换一下 with open("",'r') as f: #填入路径 line = f.readline() while line: print(line) line = f.readline()