为了进一步熟悉tensorflow的基本操作,下面通过一个线性回归的小例子简单展示一下tensorflow的基本使用流程。
数据
由于是简单的线性回归,我们自己生成一份随即数据作为演示就可以了。
def createData(W,b):
X = np.linspace(-1,1,100)
Y = W*X + b + np.random.randn(*X.shape)*W*0.1
return X,Y
生成数据如下:
构建数据流图
上面生成的数据分布是二维平面上的直线,那么公式为
y=f(x)=wx+b
X和Y是输入的训练数据,用占位符表示
#X = tf.placeholder(tf.float32,shape = trainX.shape) 默认shape=None表示任意类型
#Y = tf.placeholder(tf.float32,shape = trainY.shape)
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
需要训练的参数是w和b,因为会在每一次迭代时更新,所以需要定义为变量
W = tf.Variable(np.random.randn(),name='weight')
B = tf.Variable(np.random.randn(),name='bias')
这里公式非常简单只有一个函数 y=wx+b
#也可以Y_pred = tf.add(tf.multiply(W,X) , b)
Y_pred = W*X + B
定义损失函数
这里用L2损失
#也可以loss = tf.reduce_sum(tf.squared_difference(Y , Y_pred))
loss = tf.reduce_sum(tf.square(Y - Y_pred))
正则化
loss += 1e-6*tf.global_norm([W])
最小化损失
使用GradientDescentOptimizer优化器,tensorflow内置了一些优化器,可以直接使用。
trainOp = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
训练
epochs = 1000
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
for epoch in range(epochs):
w,b = sess.run([trainOp,W,B],feed_dict={X:trainX,Y:trainY})
训练结束后得到最终的w和b,画出来看看结果是否正确: