这篇文章让我们做线性回归。我们先加载必要的库
import tensorflow as tf
import pandas as pd
import numpy as np
我们同样也需要读取数据
df = pd.read_csv('california_housing_train.csv')
我们首选需要对数据进行随机处理,同时也对median_house_value以千为单位进行计算,方便模型更快的学习。顺便检查下数据
df = df.reindex(np.random.permutation(df.index))
df['median_house_value'] /= 1000
df.describe()
这里给我们的特征是total_rooms,预测的则是median_house_value。
书中的要求是回归,并且将RMSE降到180以下。
先设置占位符以及输入值:
x1 = np.array(df['total_rooms'])[:, np.newaxis]
y1 = np.array(df['median_house_value'])[:, np.newaxis]
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
定义神经层:
def add_layer(inputs, input_size, output_size, activation_function=None):
weights = tf.Variable(tf.random_normal([input_size, output_size]))
biases = tf.Variable(tf.zeros([output_size]) + 0.1)
Wx_b = tf.matmul(inputs, weights) + biases
if activation_function is None:
output = Wx_b
else:
output = activation_function(Wx_b)
return output
定义损失函数:
def loss(prediction, ys):
_loss = tf.sqrt(tf.reduce_mean(tf.square(prediction - ys)))
return _loss
这里损失用的RMSE而不是MSE请注意下。
定义训练方法,原文用的梯度下降法,这里我们用Adam算法:
def train_step(loss,learning_rate):
_train = tf.train.AdamOptimizer(learning_rate).minimize(loss)
return _train
下面我们就要设计神经层了,这里我用了2层,第一层用了tanh函数(如果你把原始数据画成散点图,你会发现线性根本解决不了问题,非线性效果要好很多。),第二层则没有。同时变量初始化。
output_1 = add_layer(xs, 1, 10, activation_function=tf.nn.tanh)
pred = add_layer(output_1, 10, 1, activation_function=None)
_loss = loss(pred, ys)
_train = train_step(_loss, 0.01)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
最终我训练了5000步,发现RMSE到115基本就不会再变化了。
for i in range(5000):
sess.run(_train, feed_dict={xs: x1, ys: y1})
if i % 50 == 0:
print(sess.run(_loss, feed_dict={xs: x1, ys: y1}))
文章同时希望我们换一换特征来看看,这里不再赘述。整个代码结构和原文略有不同,因为这么构建的话,我们有很多调整空间(在这里并没有显示出来)。可视化的问题留到以后再谈了除了matplotlib,tensorboard也是一个很不错的可视化工具。