TensorFlow进阶--实现反向传播

使用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)







猜你喜欢

转载自blog.csdn.net/u010936286/article/details/80709210
今日推荐