TensorFLow 基础 矩阵相乘相加 线性回归 手写字体逻辑回归 神经网络 tensorboard 显示 网络结构 和 优化记录
2018-03-31 23:12
711 查看
一、矩阵相乘相加
#-*- coding:utf-8 -*- #支持中文 #!/usr/bin/env python # 两个数相乘 相加 import tensorflow as tf # 导入tf包 a = tf.placeholder("float") # 创建一个 占位符 float类型变量 'a' b = tf.placeholder("float") # 创建一个 占位符 float类型变量 'b' y = tf.mul(a, b) # 两个数相乘操作 tf.matmul 支持矩阵乘法 sum1= tf.add(a, b) # 两个数相加操作 with tf.Session() as sess: # 创建回话 用于开始一个计算 print("%f 应该等于 2.0" % sess.run(y, feed_dict={a: 1, b: 2})) # 运行时 喂数据 赋值(字典) print("%f 应该等于 9.0" % sess.run(y, feed_dict={a: 3, b: 3})) print("%f 应该等于 6.0" % sess.run(sum1, feed_dict={a: 3, b: 3}))
二、线性回归 求参数 Linear Regression
#-*- coding:utf-8 -*- #!/usr/bin/env python # 两维变量 线性回归 linear regression import tensorflow as tf #tf包 import numpy as np #科学计算 trX = np.linspace(-1, 1, 201) # -1 到 200的线性序列 步长为1 trY = 4 * trX + 2 + np.random.randn(*trX.shape) * 0.33 # 创建一个y = 4*x + 2 带有随机数 X = tf.placeholder("float") # float类占位符 X Y = tf.placeholder("float") # float类占位符 Y ##模型函数 #简单的线性回归模型 linear regression model def model(X, w, b): return tf.mul(X, w) - b ##需要估计的变量 b = tf.Variable(0.0, name="bias") # 变量 偏置 w = tf.Variable(0.0, name="weights") # 变量 权重 # 模型 y_model = model(X, w, b) #代价函数CF cost = tf.square(Y - y_model) #误差平方为 代价函数 cost function # 优化函数 梯度下降法 学习率为0.007 train_op = tf.train.GradientDescentOptimizer(0.007).minimize(cost) # 开始回话 执行优化 with tf.Session() as sess: # 初始化变量 #tf.initialize_all_variables().run() 旧版 tf.global_variables_initializer().run() for i in range(200): for (x, y) in zip(trX, trY):# zip绑定数据和标签 分批次取出数据对 sess.run(train_op, feed_dict={X: x, Y: y})# 运行时 喂数据 赋值(字典) print(sess.run(w)) # 优化后的 权重值 接近 4 print(sess.run(b)) # 优化后的 偏置值 接近 -2 -b =2 b =-2
三维变量回归
#-*- coding:utf-8 -*- #!/usr/bin/env python # 三维变量 线性回归 linear regression import tensorflow as tf import numpy as np # 生成数据 generate date x_data = np.float32(np.random.rand(2, 100)) # 2行 100列 维度 2*100 ## 预测 两个权重 0.1 和 0.2 以及一个 偏置 0.3 # 无噪声 y_data = np.dot([0.100, 0.200], x_data) + 0.300 # y=a*x1 + b*x2 +c # 有噪声 #y_data = np.dot([0.100, 0.200], x_data) + 0.300 + np.random.randn(*(1,x_data.shape[1]))*0.11 # 创建模型 参数初始化 creat model b = tf.Variable(tf.zeros([1])) #偏置变量 b 初始化为0 W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))#1行2列 权重变量 初始化为随机 -1~1之间均匀分布 y_model = tf.matmul(W, x_data) + b#模型 # 代价函数 coss function loss = tf.reduce_mean(tf.square(y_model - y_data))# 差值平方 再求 均值 # 优化函数 梯度下降法 学习率为0.55 train_op = tf.train.GradientDescentOptimizer(0.55).minimize(loss) #train = optimizer.minimize(loss) # 初始化变量 (in this case just variable W) # init = tf.initialize_all_variables()#旧的 init =tf.global_variables_initializer() # 在会话中启动 计算图 with tf.Session() as sess: sess.run(init)#初始 4000 化变量 # 开始训练loop train for step in xrange(0, 201): #训练200次 sess.run(train_op) #执行优化函数 if step % 20 == 0: #每20步 显示一下结果 print step, sess.run(W), sess.run(b) # 结果大概为 W: [[0.100 0.200]], b: [0.300]
使用 tensorboard 显示 网络结构 和 优化记录
#-*- coding:utf-8 -*- #!/usr/bin/env python # 三维变量 线性回归 + tensorboard 显示优化记录 import tensorflow as tf import numpy as np # 生成数据 generate date x_data = np.float32(np.random.rand(2, 100)) # 2行 100列 随机数 ## 预测 两个权重 0.1 和 0.2 以及一个 偏置 0.3 # 无噪声 y_data = np.dot([0.100, 0.200], x_data) + 0.300 # y=a*x1 + b*x2 +c # 有噪声 #y_data = np.dot([0.100, 0.200], x_data) + 0.300 + np.random.randn(*(1,x_data.shape[1]))*0.11 # 创建模型 creat model b = tf.Variable(tf.zeros([1]), name="b") #偏置变量 b 初始化为0 W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name="W") #1行2列 权重变量 初始化为随机 -1~1之间均匀分布 # y_model = tf.matmul(W, x_data) + b # 模型 y_model = tf.add(tf.matmul(W, x_data, name="MatMul") , b , name="Add")# 模型 为每一个操作 添加名字 可以在在图中显示 # 代价函数 coss function 最小化方差 #loss = tf.reduce_mean(tf.square(y_model - y_data)) #差值平方 均值 为每一步操作 添加名字 loss = tf.reduce_mean(tf.square(tf.sub(y_model , y_data, name = "Sub"),name="Square"), name="ReduceMean") # 差值 平方 均值
# 优化函数 梯度下降法 学习率为0.55 #train_op = tf.train.GradientDescentOptimizer(0.55).minimize(loss) optimizer = tf.train.GradientDescentOptimizer(0.2, name="Optimizer") # 为 优化步骤 名字 train = optimizer.minimize(loss, name="minimizer") # 为最小化步骤添加名字 ## 声明 summary 记录数据 用于可视化显示 # 分别记录 权重W 偏置b 以及 误差loss的变化 变量 tf.summary.histogram 常量 tf.summary.scalar # summarizes = [tf.histogram_summary("W",W), tf.histogram_summary("b",b), tf.scalar_summary("loss",loss)] summarizes = [tf.summary.histogram("W",W), tf.summary.histogram("b",b), tf.summary.scalar("loss",loss)] # 记录操作 合并在一起 # summary_op = tf.merge_summary(summarizes) summary_op = tf.summary.merge(summarizes) # 初始化变量 (in this case just variable W) # init = tf.initialize_all_variables() #旧的 #init =tf.global_variables_initializer() # 在会话中启动计算图 with tf.Session() as sess: #初始化变量 # tf.initialize_all_variables() no long valid from # 2017-03-02 if using tensorflow >= 0.12 if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1: init = tf.initialize_all_variables() #旧版 else: init = tf.global_variables_initializer()#新版 sess.run(init) # 记录拟合日志 # summary_writer = tf.train.SummaryWriter("./log/linear_regression_log", graph_def=sess.graph) summary_writer = tf.summary.FileWriter("./logs/linear_regression_log", graph = sess.graph)#外加记录网络图模型 sess.graph # 使用 tensorboard --logdir="/目录" 会给出一段网址: 打开即可 显示可视化的 信息 # 开始训练loop train for step in xrange(0, 1000):#训练1000次 sess.run(train)#执行优化函数 if step % 20 == 0:#每20步 显示一下结果 print step, sess.run(W), sess.run(b) summary_str = sess.run(summary_op) summary_writer.add_summary(summary_str, global_step=step) # you will get the result W: [[0.100 0.200]], b: [0.300]
三、逻辑回归 输出0/1
#-*- coding:utf-8 -*- #!/usr/bin/env python # 手写字体 逻辑回归(仅有权重) import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data # 读取mnist手写字体数据工具 ## 初始化权重 带入矩阵权重的维度信息 ##### def init_weights(shape): return tf.Variable(tf.random_normal(shape, stddev=0.01))# 均匀分布初始化 标准差为 0.01 ## 模型函数 #### def model(X, w): return tf.matmul(X, w) # notice we use the same model as linear regression, #this is because there is a baked in cost function which performs softmax and cross entropy ## 数据处理 data preprocessing mnist = input_data.read_data_sets("../minist/MNIST_data/", one_hot=True)# 读取数据 # 训练数据 训练数据标签 测试数据 测试数据标签 trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels ## 训练数据的 占位符 X = tf.placeholder("float", [None, 784]) # 28*28的图像 展开成一维度 1*784 同时输入多张图像 Y = tf.placeholder("float", [None, 10]) # 标签为1*10 分别表示是哪一个数字 仅有一个1 其余都是0 ## 权重初始化 w = init_weights([784, 10]) # 784*10 输入n×784 .* 784*10 -> n*10 最后每张图像输出 1*10 标签 0/1 ## 预测值 pred_y_x = model(X, w)# 每个图像 会得到10个值 分别对应是 0~9 的可能性 #(logits, labels, name=None) cross_entropy = -tf.reduce_sum(y_real*tf.log(y_predict)) ## 计算代价函数 softmax回归(归一化)后 利用实际标签Y求对数信息增益 再求均值 预测 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred_y_x, Y)) # compute mean cross entropy (softmax is applied internally) ## 优化函数 梯度下降法 学习率为0.05 train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost) ## 预测值 predict_op = tf.argmax(pred_y_x, 1) # 逻辑回归输出(1*10)中的最大值即为 预测数字 ## 变量初始化 # init = tf.initialize_all_variables()#旧的 init =tf.global_variables_initializer() ## 在会话中 启动图 with tf.Session() as sess: # 初始化变量 #tf.initialize_all_variables().run() 旧版 #tf.global_variables_initializer().run() sess.run(init) for i in range(50):#训练50次 for start, end in zip(range(0, len(trX), 128), range(128, len(trX)+1, 128)):# [0 128 256...] [128 256 ...] sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]}) print(i, np.mean(np.argmax(teY, axis=1) == sess.run(predict_op, feed_dict={X: teX})))# 每次训练后使用测试集测试
模型加入偏置参数
#-*- coding:utf-8 -*- #!/usr/bin/env python # 手写字体 逻辑回归(权重+偏置) import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data # 读取mnist手写字体数据工具 ## 初始化权重 ##### def init_weights(shape): return tf.Variable(tf.random_normal(shape, stddev=0.01)) ## 模型函数 #### def model(X, w, b): return tf.matmul(X, w) + b ## 数据处理 data preprocessing mnist = input_data.read_data_sets("../minist/MNIST_data/", one_hot=True) # 训练数据 训练数据标签 测试数据 测试数据标签 trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels ## 训练数据的 占位符 X = tf.placeholder("float", [None, 784]) # a picture is a 784 dimension verb Y = tf.placeholder("float", [None, 10]) # a label is a 10dimension verb which has only one 1 ,others is 0 ## 权重初始化 w = init_weights([784, 10]) # 784*10 输入n×784 .* 784*10 -> n*10 最后每张图像输出 1*10 ## 偏置 b = tf.Variable(tf.zeros([10])) # 1*10 ## 模型 pred_y_x = model(X, w, b) #(logits, labels, name=None) cross_entropy = -tf.reduce_sum(y_real*tf.log(y_predict)) ## 计算代价函数 softmax回归 后 对数 信息增益 均值 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred_y_x, Y)) ## 优化函数 梯度下降法 学习率为0.05 train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost) # construct optimizer ## 预测值 predict_op = tf.argmax(pred_y_x, 1) # 逻辑回归输出(1*10)中的最大值即为 预测数字 ## 变量初始化 # init = tf.initialize_all_variables()#旧的 init = tf.global_variables_initializer() ## 启动 图 回话 with tf.Session() as sess: # 初始化变量 #tf.initialize_all_variables().run() 旧版 #tf.global_variables_initializer().run() sess.run(init) for i in range(50):#训练50次 for start, end in zip(range(0, len(trX), 128), range(128, len(trX)+1, 128)): sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]}) print(i, np.mean(np.argmax(teY, axis=1) == sess.run(predict_op, feed_dict={X: teX})))#在每次训练后测试 测试集
四、简单神经网络 使用参数变量控制程序 + tensorboard显示优化记录
#-*- coding:utf-8 -*- #!/usr/bin/env python # 神经网 28*28 矩阵图输入 from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf ## 导入 mnist数据集 读取工具 from tensorflow.examples.tutorials.mnist import input_data ## 参数设置 使用flag设置参数变量 来统一管理 flags = tf.app.flags FLAGS = flags.FLAGS flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data for unit testing.') ## 假数据 布尔数据类型 flags.DEFINE_integer('max_steps', 1000, 'Number of steps to run trainer.') ## 最大学习步数 整数类型 flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.') ## 初始学习率 浮点数类型 flags.DEFINE_float('dropout', 0.9, 'Keep probability for training dropout.') ## 神经元部分激活概率 浮点数类型 flags.DEFINE_string('data_dir', '../minist/MNIST_data/', 'Directory for storing data') ## 数据集路径 字符串类型 flags.DEFINE_string('summaries_dir', './logs/mnist_LogReg_logs', 'Summaries directory')## 训练日志存储路径 字符串类型 ## 训练步骤################################################################### def train(): ## 输入数据 mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True, fake_data=FLAGS.fake_data)# 读取 sess = tf.InteractiveSession()##交互式 会话 ## 创建一个多层模型 Create a multilayer model. ## 输入数据占位符 with tf.name_scope('input'):## 为了可视化显示 定义每一步操作的名字 x = tf.placeholder(tf.float32, [None, 784], name='x-input') # 特征输入 28*28=784 1*784 y_ = tf.placeholder(tf.float32, [None, 10], name='y-input') # 标签输入 1*10维 ## 改变数据 形状 with tf.name_scope('input_reshape'): image_shaped_input = tf.reshape(x, [-1, 28, 28, 1]) # tf.image_summary('input', image_shaped_input, 10)# 对输入数据进行 变形 并记录 tf.summary.image('input', image_shaped_input, 10) # 对输入数据进行 变形 并记录 # 随机初始化 权重 def weight_variable(shape): """Create a weight variable with appropriate initialization.""" initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial) # 初始化偏置 def bias_variable(shape): """Create a bias variable with appropriate initialization.""" initial = tf.constant(0.1, shape=shape) # 0.1常量 return tf.Variable(initial) # 记录变量 的各项参数 # summary.scalar 记录常量 summary.histogram 记录变量 def variable_summaries(var, name): with tf.name_scope('summaries'):##操作名字 mean = tf.reduce_mean(var) # 计算均值操作 tf.summary.scalar('mean/' + name, mean)# 记录数据的均值 with tf.name_scope('stddev'): # 计算标准差 操作 stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean))) tf.summary.scalar('sttdev/' + name, stddev)# 记录数据的标准差 tf.summary.scalar('max/' + name, tf.reduce_max(var))# 记录数据的最大值 tf.summary.scalar('min/' + name, tf.reduce_min(var))# 记录数据的最小值 tf.summary.histogram(name, var)# 记录变量数据本身 ## 定义神经网络函数 def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu): """简单的神经网络层 矩阵相乘 加上偏置 使用非线性激活函数激活. 同时也记录了一些变量的 变化 """ with tf.name_scope(layer_name):#操作名字 层 的名字 #创建权重 with tf.name_scope('weights'): weights = weight_variable([input_dim, output_dim])#按相关尺寸 创建权重变量 variable_summaries(weights, layer_name + '/weights')#记录变量的各项参数 #创建偏置 with tf.name_scope('biases'): biases = bias_variable([output_dim]) variable_summaries(biases, layer_name + '/biases') #创建操作 with tf.name_scope('Wx_plus_b'): preactivate = tf.matmul(input_tensor, weights) + biases # y = w * x + b 实现线性变换 tf.summary.histogram(layer_name + '/pre_activations', preactivate)#记录变量 preactivate 激活前 activations = act(preactivate, 'activation') # 使用非线性激活函数激活 实现非线性操作 tf.summary.histogram(layer_name + '/activations', activations)#记录激活后的输出 return activations #####以上为 train 定义的 变白 函数部分 以下为其实际执行的部分################################ ### 创建一个隐含层 输入 784 输出 500 名为 layer1########################### hidden1 = nn_layer(x, 784, 500, 'layer1') #### 部分神经元激活 with tf.name_scope('dropout'): keep_prob = tf.placeholder(tf.float32)#占位符 tf.summary.scalar('dropout_keep_probability', keep_prob)#记录常量 dropout参数 dropped = tf.nn.dropout(hidden1, keep_prob) ## 部分神经元输出 ## 创建输出层 输入 500 输出 10 名为 layer2 最后softmax回归输出 0~9 y = nn_layer(dropped, 500, 10, 'layer2', act=tf.nn.softmax)# 最后 softmax非线性 归一化 exp(xi)/sum(exp(xi)) ### 计算信息熵 系统混乱度 with tf.name_scope('cross_entropy'): diff = y_ * tf.log(y) # y_ 为真实标签 y为预测概率(0~1 softmax的输出) with tf.name_scope('total'): cross_entropy = -tf.reduce_mean(diff)#均值 tf.summary.scalar('cross entropy', cross_entropy)#记录常量信息熵 # loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_)) ### 训练优化 Adam算法优化 with tf.name_scope('train'): train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(cross_entropy) ### 计算 准确度 with tf.name_scope('accuracy'): with tf.name_scope('correct_prediction'): correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))#和标签相等即为正确1 否者错误为0 #看预测的10个标签里的最大值是否为真实标签 with tf.name_scope('accuracy'): accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))#均值 tf.summary.scalar('accuracy', accuracy)##记录准确度 # 合并所有的 日志记录 写入相应的文件中 merged = tf.merge_all_summaries() train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train', graph = sess.graph) #训练 外加记录 网络模型图 test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test')#测试 #初始化变量 #tf.initialize_all_variables().run() if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1: tf.initialize_all_variables().run()#旧版 else: tf.global_variables_initializer().run()#新版 # 训练模型,记录训练日志. # 每隔10步, 测试 测试集 准确度,记录测试日志 ## 产生训练和测试数据 喂数据 def feed_dict(train): if train or FLAGS.fake_data: # 训练集 xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data) k = FLAGS.dropout # 训练时部分神经元激活 else:# 测试集 xs, ys = mnist.test.images, mnist.test.labels k = 1.0 # 测试时 全部神经元激活 return {x: xs, y_: ys, keep_prob: k} for i in range(FLAGS.max_steps): if i % 10 == 0: # 每10步 9e08 记录日志 使用测试数据集 summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False)) test_writer.add_summary(summary, i) print('Accuracy at step %s: %s' % (i, acc))## 打印准确度 else: # 每100步 记录状态 执行测试 99 199 .. if i % 100 == 99: # Record execution stats run_options = tf.RunOptions(trace_level = tf.RunOptions.FULL_TRACE) run_metadata = tf.RunMetadata() summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True), options=run_options, run_metadata=run_metadata) train_writer.add_run_metadata(run_metadata, 'step%03d' % i) train_writer.add_summary(summary, i) print('Adding run metadata for', i) else: # 其他步骤 记录日志 summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True)) train_writer.add_summary(summary, i) train_writer.close() test_writer.close() def main(_): if tf.gfile.Exists(FLAGS.summaries_dir): tf.gfile.DeleteRecursively(FLAGS.summaries_dir) tf.gfile.MakeDirs(FLAGS.summaries_dir) train() if __name__ == '__main__': tf.app.run()
相关文章推荐
- 利用tensorflow一步一步实现基于MNIST 数据集进行手写数字识别的神经网络,逻辑回归
- 深度学习与TensorFlow实战(六)全连接网络基础—MNIST数据集输出手写数字识别准确率
- Tensorflow基础:神经网络进一步优化
- Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归
- Tensorflow深度学习之三:基础概念篇(矩阵相乘)
- tensorflow 1.01中GAN(生成对抗网络)手写字体生成例子(MINST)的测试
- tensorflow 学习笔记12 循环神经网络RNN LSTM结构实现MNIST手写识别
- 【Tensorflow】TensorBoard可视化网络结构和参数Tensorboard windows显示空白
- 神经网络,逻辑回归,矩阵求导
- Machine Learning - WEEK 1 2 3- 线性回归 、逻辑回归、梯度下降法及其优化算法、传统方法、 Octave 入门
- 《神经网络和深度学习》之神经网络基础(第二周)课后作业——神经网络思维的逻辑回归
- 机器学习逻辑回归神经网络手写数字识别(matlab)
- 10分钟搞懂Tensorflow 逻辑回归实现手写识别
- Tensorflow实战学习(八)【机器学习基础 线性回归】
- 深度学习与TensorFlow实战(七)全连接网络基础—真实图片输出手写数字识别准确率
- Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归
- Tensorflow学习教程------模型参数和网络结构保存且载入,输入一张手写数字图片判断是几
- 各框架下(tensorflow, pytorch, theano, keras)实现几个基础结构神经网络(mlp, autoencoder, CNNs, recurrent, recursive)
- TensorFlow 线性回归梯度下降模拟手写并可视化
- Tensorflow基础:神经网络优化算法