import tensorflow as tf
#创建一个常量op m1 = tf.constant([[3,3]]) #创建一个常量op m2 = tf.constant([[2],[3]]) #创建一个矩阵乘法op,把m1和m2传入,此时op的乘法并未执行,下面调用run时才会执行 product = tf.matmul(m1,m2) #这个时候打印product,只能看到product的属性,不能计算它的值 print(product)
#第一种定义会话的方式: #定义一个会话,启动默认图 sess = tf.Session() #调用sess的run方法来执行矩阵乘法op #run(product)触发了图中3个op result = sess.run(product) print(result) sess.close()
#第二种定义会话的方式,此种方式session会自动关闭,不需要手动去关闭 with tf.Session() as sess: #调用sess的run方法来执行矩阵乘法op #run(product)触发了图中3个op result = sess.run(product) print(result)
#定义一个变量 x = tf.Variable([1,2]) #定义一个常量 a = tf.constant([3,3]) #增加一个减法op sub = tf.subtract(x,a) #增加一个加法op add = tf.add(x,sub) #所有变量初始化,变量不初始化会报错 init = tf.global_variables_initializer() with tf.Session() as sess: #执行变量初始化 sess.run(init) print(sess.run(sub)) print(sess.run(add))
#创建一个变量初始化为0 state = tf.Variable(0,name='counter') #创建一个op,作用是使state加1 new_value = tf.add(state,1) #赋值op,变量赋值只能用函数assign,而不能用等于号 update = tf.assign(state,new_value) #所有变量初始化 init = tf.global_variables_initializer() with tf.Session() as sess: #执行变量初始化 sess.run(init) print(sess.run(state)) for _ in range(5): sess.run(update) print(sess.run(state))
#Fetch:可以在session中同时计算多个op #定义三个常量 input1 = tf.constant(3.0) input2 = tf.constant(2.0) input3 = tf.constant(5.0) #定义一个加法op add = tf.add(input2,input3) #定义一个乘法op mul = tf.multiply(input1,add) with tf.Session() as sess: #同时执行乘法op和加法op result = sess.run([mul,add]) print(result)
#Feed:先定义占位符,等需要的时候再传入数据 #创建占位符 input1 = tf.placeholder(tf.float32) input2 = tf.placeholder(tf.float32) #定义乘法op output = tf.multiply(input1,input2) with tf.Session() as sess: #feed的数据以字典的形式传入 print(sess.run(output,feed_dict={input1:[8.],input2:[2.]}))
示例说明:先定义一个线性函数,并准备线性函数上的100个点作为训练数据; 生成一个线性模型,并用训练数据训练模型,使得线性模型去逼近或等于预先定义好的线性函数;
import tensorflow as tf import numpy as np
#使用numpy生成100个随机点 x_data = np.random.rand(100) y_data = x_data*0.1 + 0.2 #构造一个线性模型,需要训练的参数为k和b b = tf.Variable(1.1) k = tf.Variable(0.5) y = k*x_data + b #评价模型用的损失函数为均方误差 loss = tf.reduce_mean(tf.square(y_data-y)) #定义一个梯度下降法来进行训练的优化器 optimizer = tf.train.GradientDescentOptimizer(0.2) #最小化代价函数 train = optimizer.minimize(loss) #初始化变量 init = tf.global_variables_initializer() #总共进行201次迭代,随着迭代的进行,k值越来越接近真值0.1,b值越来越接近真值0.2 with tf.Session() as sess: sess.run(init) for step in range(201): sess.run(train) if step%20 ==0: print(step,sess.run([k,b]))
该示例中的神经网络为三层,第一层输入层为1个神经元,第二层中间层为10个神经元,第三层输出层为1个神经元
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt
#使用numpy生成200个随机点,[:,np.newaxis]表示增加了一个维度,生成一个200行1列的矩阵 x_data = np.linspace(-0.5,0.5,200)[:,np.newaxis] noise = np.random.normal(0,0.02,x_data.shape)#噪声点的数量和矩阵形状跟x_data一样 y_data = np.square(x_data) + noise #定义两个placeholder,[None,1]表示行的数量为任意都行,列为1列 x = tf.placeholder(tf.float32,[None,1]) y = tf.placeholder(tf.float32,[None,1]) #定义神经网络中间层 #[1,10]权值矩阵第一个参数表示上一层神经元的数量 #偏置值中的[1,10],第一个参数固定为1,第二个表示本层神经元的个数,每个神经元只有一个偏置值 Weights_L1 = tf.Variable(tf.random_normal([1,10]))#神经元的权值矩阵 biases_L1 = tf.Variable(tf.zeros([1,10]))#神经元偏置值 Wx_plus_b_L1 = tf.matmul(x,Weights_L1) + biases_L1#神经元的总输出 L1 = tf.nn.tanh(Wx_plus_b_L1)#神经元的激活函数,此处用的是双曲正切函数 #定义神经网络输出层 Weights_L2 = tf.Variable(tf.random_normal([10,1])) biases_L2 = tf.Variable(tf.zeros([1,1])) Wx_plus_b_L2 = tf.matmul(L1,Weights_L2) + biases_L2 prediction = tf.nn.tanh(Wx_plus_b_L2) #二次代价函数 loss = tf.reduce_mean(tf.square(y-prediction)) #使用梯度下降法训练 train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) with tf.Session() as sess: #变量初始化 sess.run(tf.global_variables_initializer()) for _ in range(2000): sess.run(train_step,feed_dict={x:x_data,y:y_data}) #获得预测值 prediction_value = sess.run(prediction,feed_dict={x:x_data}) #画图 plt.figure() plt.scatter(x_data,y_data) plt.plot(x_data,prediction_value,'r-',lw=5) plt.show()
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data
#载入数据集 mnist = input_data.read_data_sets("MNIST_data",one_hot=True) batch_xs,batch_ys = mnist.train.next_batch(batch_size) #该神经网络训练时,一次放入一个批次的图片 #每个批次的大小 batch_size = 50 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #定义两个placeholder x = tf.placeholder(tf.float32,[None,784]) y = tf.placeholder(tf.float32,[None,10]) #创建一个简单的神经网络 W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) prediction = tf.nn.softmax(tf.matmul(x,W)+b) #二次代价函数 loss = tf.reduce_mean(tf.square(y-prediction)) #使用梯度下降法 train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss) #初始化变量 init = tf.global_variables_initializer() #结果存放在一个布尔型列表中,equal函数返回Ture或false correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置 #求准确率 accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) with tf.Session() as sess: sess.run(init) for epoch in range(21): for batch in range(n_batch): batch_xs,batch_ys = mnist.train.next_batch(batch_size) sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys}) acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}) print("Iter " + str(epoch) + ",Testing Accuracy " + str(acc))
上面的均方误差做为损失函数时,迭代了3次,准确率到90%,20次准确率到92%; 交叉熵做为损失函数时,迭代了1次,准确率到90%,迭代了7次准确率到92%; 对比下,交叉熵的收敛速度快很多;
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = input_data.read_data_sets("MNIST_data",one_hot=True) #每个批次的大小 batch_size = 50 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #定义两个placeholder x = tf.placeholder(tf.float32,[None,784]) y = tf.placeholder(tf.float32,[None,10]) #创建一个简单的神经网络 W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) prediction = tf.nn.softmax(tf.matmul(x,W)+b) #二次代价函数 # loss = tf.reduce_mean(tf.square(y-prediction)) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction)) #使用梯度下降法 train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss) #初始化变量 init = tf.global_variables_initializer() #结果存放在一个布尔型列表中 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置 #求准确率 accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) with tf.Session() as sess: sess.run(init) for epoch in range(21): for batch in range(n_batch): batch_xs,batch_ys = mnist.train.next_batch(batch_size) sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys}) acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}) print("Iter " + str(epoch) + ",Testing Accuracy " + str(acc))
dropout可以用来防止过拟合,但相对的,模型的收敛速度会变慢
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = input_data.read_data_sets("MNIST_data",one_hot=True) #每个批次的大小 batch_size = 50 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #定义两个placeholder x = tf.placeholder(tf.float32,[None,784]) y = tf.placeholder(tf.float32,[None,10]) keep_prob=tf.placeholder(tf.float32) #创建一个简单的神经网络,并使用截断的正态分布来进行初始化,该初始化方法相对较好 W1 = tf.Variable(tf.truncated_normal([784,100],stddev=0.1)) b1 = tf.Variable(tf.zeros([100])+0.1) L1 = tf.nn.tanh(tf.matmul(x,W1)+b1) L1_drop = tf.nn.dropout(L1,keep_prob) W2 = tf.Variable(tf.truncated_normal([100,50],stddev=0.1)) b2 = tf.Variable(tf.zeros([50])+0.1) L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2) L2_drop = tf.nn.dropout(L2,keep_prob) # W3 = tf.Variable(tf.truncated_normal([100,50],stddev=0.1)) # b3 = tf.Variable(tf.zeros([50])+0.1) # L3 = tf.nn.tanh(tf.matmul(L2_drop,W3)+b3) # L3_drop = tf.nn.dropout(L3,keep_prob) W4 = tf.Variable(tf.truncated_normal([50,10],stddev=0.1)) b4 = tf.Variable(tf.zeros([10])+0.1) prediction = tf.nn.softmax(tf.matmul(L2_drop,W4)+b4) #二次代价函数 # loss = tf.reduce_mean(tf.square(y-prediction)) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction)) #使用梯度下降法 train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss) #初始化变量 init = tf.global_variables_initializer() #结果存放在一个布尔型列表中 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置 #求准确率 accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) with tf.Session() as sess: sess.run(init) for epoch in range(31): for batch in range(n_batch): batch_xs,batch_ys = mnist.train.next_batch(batch_size) sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7}) test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0}) train_acc = sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels,keep_prob:1.0}) print("Iter " + str(epoch) + ",Testing Accuracy " + str(test_acc) +",Training Accuracy " + str(train_acc))
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = input_data.read_data_sets("MNIST_data",one_hot=True) #每个批次的大小 batch_size = 50 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #定义两个placeholder x = tf.placeholder(tf.float32,[None,784]) y = tf.placeholder(tf.float32,[None,10]) keep_prob=tf.placeholder(tf.float32) #创建一个简单的神经网络,并使用截断的正态分布来进行初始化,该初始化方法相对较好 W1 = tf.Variable(tf.truncated_normal([784,200],stddev=0.1)) b1 = tf.Variable(tf.zeros([200])+0.1) L1 = tf.nn.tanh(tf.matmul(x,W1)+b1) L1_drop = tf.nn.dropout(L1,keep_prob) W2 = tf.Variable(tf.truncated_normal([200,50],stddev=0.1)) b2 = tf.Variable(tf.zeros([50])+0.1) L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2) L2_drop = tf.nn.dropout(L2,keep_prob) # W3 = tf.Variable(tf.truncated_normal([100,50],stddev=0.1)) # b3 = tf.Variable(tf.zeros([50])+0.1) # L3 = tf.nn.tanh(tf.matmul(L2_drop,W3)+b3) # L3_drop = tf.nn.dropout(L3,keep_prob) W4 = tf.Variable(tf.truncated_normal([50,10],stddev=0.1)) b4 = tf.Variable(tf.zeros([10])+0.1) prediction = tf.nn.softmax(tf.matmul(L2_drop,W4)+b4) #二次代价函数 # loss = tf.reduce_mean(tf.square(y-prediction)) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction)) #使用梯度下降法 #train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss) train_step = tf.train.AdamOptimizer(1e-3).minimize(loss) #初始化变量 init = tf.global_variables_initializer() #结果存放在一个布尔型列表中 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置 #求准确率 accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) with tf.Session() as sess: sess.run(init) for epoch in range(31): for batch in range(n_batch): batch_xs,batch_ys = mnist.train.next_batch(batch_size) sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7}) test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0}) train_acc = sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels,keep_prob:1.0}) print("Iter " + str(epoch) + ",Testing Accuracy " + str(test_acc) +",Training Accuracy " + str(train_acc))
该方法中,学习率是随着训练的进行,逐渐减小;
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = input_data.read_data_sets("MNIST_data",one_hot=True) #每个批次的大小 batch_size = 100 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #定义两个placeholder x = tf.placeholder(tf.float32,[None,784]) y = tf.placeholder(tf.float32,[None,10]) keep_prob=tf.placeholder(tf.float32) lr = tf.Variable(0.001, dtype=tf.float32) #创建一个简单的神经网络 W1 = tf.Variable(tf.truncated_normal([784,500],stddev=0.1)) b1 = tf.Variable(tf.zeros([500])+0.1) L1 = tf.nn.tanh(tf.matmul(x,W1)+b1) L1_drop = tf.nn.dropout(L1,keep_prob) W2 = tf.Variable(tf.truncated_normal([500,300],stddev=0.1)) b2 = tf.Variable(tf.zeros([300])+0.1) L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2) L2_drop = tf.nn.dropout(L2,keep_prob) W3 = tf.Variable(tf.truncated_normal([300,10],stddev=0.1)) b3 = tf.Variable(tf.zeros([10])+0.1) prediction = tf.nn.softmax(tf.matmul(L2_drop,W3)+b3) #交叉熵代价函数 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction)) #训练 train_step = tf.train.AdamOptimizer(lr).minimize(loss) #初始化变量 init = tf.global_variables_initializer() #结果存放在一个布尔型列表中 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置 #求准确率 accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) with tf.Session() as sess: sess.run(init) for epoch in range(31): sess.run(tf.assign(lr, 0.001 * (0.95 ** epoch))) for batch in range(n_batch): batch_xs,batch_ys = mnist.train.next_batch(batch_size) sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0}) learning_rate = sess.run(lr) acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0}) print ("Iter " + str(epoch) + ", Testing Accuracy= " + str(acc) + ", Learning Rate= " + str(learning_rate))