使用TensorFlow的一个优势是,它可以维护操作状态和基于反向传播自动地更新模型变量。
下面我们介绍两个例子,来实现反向传播
示例一:
输入数据为:x满足均值为1,方差为0.1的正态分布
输出y为10
模型为:y=a×x
损失函数为L2正则损失函数
理论结果a应为10
首先我们导入计算模块,并创建计算图会话,然后生成数据、创建占位符和变量A
#创建计算图会话 sess = tf.Session() #生成数据并创建在占位符和变量A x_vals = np.random.normal(1,0.1,100) y_vals = np.repeat(10.,100) x_data = tf.placeholder(tf.float32,shape=[1]) y_target = tf.placeholder(tf.float32,shape=[1]) A = tf.Variable(tf.random_normal(shape=[1]))
其次我们构建模型y=ax
#增加乘法操作 my_output = tf.multiply(x_data,A)
接下来创建损失函数Loss,并初始化变量
#增加L2正则损失函数 loss = tf.square(my_output-y_target) #在运行之前,需要初始化变量 init = tf.initialize_all_variables() sess.run(init)
然后创建tensorflow自带优化器对象,并输入学习率
#声明变量的优化器 my_opt = tf.train.GradientDescentOptimizer(learning_rate=0.02) train_step = my_opt.minimize(loss)
最后,进行迭代训练
#训练算法 for i in range(100): rand_index = np.random.choice(100) rand_x = [x_vals[rand_index]] rand_y = [y_vals[rand_index]] sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y}) #打印 if (i+1)%25 ==0: print('step =' + str(i+1) +' A = '+ str(sess.run(A))) print('loss =' + str(sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})) )
运行结果如下:
这里得出的结果A=9.89与10接近,损失函数loss值为0.01
示例二:二值分类
输入数据:x为从两个正态分布N(-1,1)和N(3,1)生成100个数
输出目标:所有从正太分布N(-1,1)生成的数据为0,从N(3,1)生成的数据目标为1
算法模型:y=sigmoid(x+A)
损失函数:非归一化logits的交叉熵损失函数
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #创建计算图会话 sess = tf.Session() #生成数据并创建在占位符和变量A x_vals = np.concatenate((np.random.normal(-1,1,50),np.random.normal(3,1,50))) y_vals = np.concatenate((np.repeat(0.,50),np.repeat(1.,50))) x_data = tf.placeholder(tf.float32,shape=[1]) y_target = tf.placeholder(tf.float32,shape=[1]) A = tf.Variable(tf.random_normal(mean=10,shape=[1])) #增加加法操作 my_output = tf.add(x_data,A) #由于非归一化logits的交叉熵的损失函数期望批量数据增加一个批量数据的维度 my_output_expanded = tf.expand_dims(my_output,0) y_target_expanded = tf.expand_dims(y_target,0) #在运行之前,需要初始化变量 init = tf.initialize_all_variables() sess.run(init) #增加非归一化logits的交叉熵的损失函数 loss = tf.nn.sigmoid_cross_entropy_with_logits( logits=my_output_expanded , labels=y_target_expanded ) #声明变量的优化器 my_opt = tf.train.GradientDescentOptimizer(learning_rate=0.05) train_step = my_opt.minimize(loss) num = 1500 step = np.zeros(num) LOSS = np.zeros_like(step) #训练算法 for i in range(num): rand_index = np.random.choice(100) rand_x = [x_vals[rand_index]] rand_y = [y_vals[rand_index]] sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y}) #打印 step[i]= i LOSS[i] = sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y}) if (i+1)%200 ==0: print('step =' + str(i+1) +' A = '+ str(sess.run(A))) print('loss =' + str(LOSS[i]) ) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(step,LOSS,label='loss') ax.set_xlabel('step') ax.set_ylabel('loss') fig.suptitle('sigmoid_cross_entropy_with_logits') handles,labels = ax.get_legend_handles_labels() ax.legend(handles,labels=labels) plt.show() # logdir = './log' # write = tf.summary.FileWriter(logdir=logdir,graph=sess.graph)