TensorFlow实现反向传播
本节先举个简单的回归算法的例子。这里先举一个简单的例子,从均值1,标准差为0.1的正态分布中随机抽样100个数,然后乘以变量A,损失函数L2正则函数,也就是实现函数X*A=target,X为100个随机数,target为10,那么A的最优结果也为10。
第二个例子是一个简单的二值分类算法。从两个正态分布(N(-1,1)和N(3,1))生成100个数。
所有从正态分布N(-1,1)生成的数据标为目标类0;从正态分布N(3,1)生成的数据标为目标类1,模型
算法通过sigmoid函数将这些生成的数据转换成目标类数据。换句话讲,模型算法是sigmoid(x+A),其中,
A是要拟合的变量,理论上A=-1。假设,两个正态分布的均值分别是m1和m2,则达到A的取值时,它们通
过-(m1+m2)/2转换成到0等距的值。后面将会在TensorFlow中见证怎样取到相应的值。
同时,指定一个合适的学习率对机器学习算法的收敛是有帮助的。优化器类型也需要指定,前面的两个
例子会使用标准梯度下降法,它在TensorFlow中的实现是GradientDescentOptimizer()函数。
这里是回归算法例子:
In [15]:
import numpy as np
import tensorflow as tf
In [16]:
sess = tf.Session()
In [17]:
x_vals = np.random.normal(1, 0.1, 100)
x_vals
Out[17]:
In [18]:
y_vals = np.repeat(10., 100)
y_vals
Out[18]:
In [19]:
x_data = tf.placeholder(shape=[1], dtype=tf.float32)
y_target = tf.placeholder(shape=[1], dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[1]))
A
Out[19]:
In [20]:
my_output = tf.multiply(x_data, A)
In [21]:
loss = tf.square(my_output - y_target)
In [22]:
init = tf.global_variables_initializer()
sess.run(init)
In [23]:
my_opt = tf.train.GradientDescentOptimizer(learning_rate=0.02)
train_step = my_opt.minimize(loss)
In [25]:
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})))