【学习笔记】初见tensorflow

这篇文章让我们做线性回归。我们先加载必要的库

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也是一个很不错的可视化工具。

猜你喜欢

转载自blog.csdn.net/Canon__/article/details/82726986