我使用的是tensorflow1.13.2-gpu的版本。
关于环境配置可以参考windows下的tensorflow-gpu=1.13.2环境配置
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#使用numpy生成200个随机点
x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
noise = np.random.normal(0,0.02,x_data.shape)
y_data = np.square(x_data) + noise
#定义两个placeholder
x = tf.placeholder(tf.float32, [None,1])
y = tf.placeholder(tf.float32, [None,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)
#定义nn输出层
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)
#二次代价函数
cost = tf.reduce_mean(tf.square(y-prediction))
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cost)
with tf.Session() as sess:
#变量初始化
sess.run(tf.global_variables_initializer())
for i in range(2000):
sess.run(train_step, feed_dict={x:x_data, y:y_data})
print(sess.run(cost, 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()
本次学习中,有几个新知识。
x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
其中,[:, np.newaxis]这个的意思是给前面的向量增加维度,前面本来是一个n行向量,增加维度后就变成了n*1维度矩阵了,此操作是为了使后面的张量与权重相乘时保持维度的一致。
x = tf.placeholder(tf.float32, [None,1])
tf.placeholder函数的作用类似于生成形参,sess中每次run才会进行一个operation操作。
sess.run(train_step, feed_dict={x:x_data, y:y_data})
在sess.run的时候,将数据传给placeholder定义的形参,run操作成功执行,若使用了placeholder但是在run的时候没有传入placeholder需要的数据则会报错。
cost = tf.reduce_mean(tf.square(y-prediction))
cost function使用的是均方误差。 使用梯度下降最小化cost function即可完成对网络Weights和bias的训练。