使用Tensorflow创建基本线性回归神经网络
使用Tensorflow的概念和文档来构建模型。
第1步:导入库
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import random
我使用numpy作为库来创建矩阵。
为了可视化实际的最佳拟合线,我需要一个允许我绘制函数和点的库。为此,我选择了matlplotlib。
我随机导入随机初始化数字以填充我的训练集,确保我的模型能够准确地为所有可能的数据点创建最合适的行。
第2步:初始化变量
#params learning_rate = 0.01 training_epochs = 6000 steps = 100
在这段代码中,我设置了变量要训练多长时间(6000个epochs),我们要调整每个步骤的权重和偏差(学习速率)。
第3步:初始化数据集
#training sets, a two arrays with random values trainX = np.random.rand(9) trainY = np.random.rand(9)
我创建了两个一维数组,每个数组可以容纳9个值,并用0-1之间的值填充它们。TrainX表示数据点的X值,TrainY表示Y值。这些将在以后合并为元组。
第4步:初始化权重和偏差
random = random.uniform(0,20) #weights and biases W = tf.Variable((random), name = "Weight") b = tf.Variable((random), name = "Bias")
我使用tf.Variable初始化我的权重和偏差,将它们设置为0-20之间的随机值。这些将在优化期间发生变化
第5步:创建线性函数
#linear model prediction = tf.add(tf.multiply(X, W), b)
我的假设函数
在这里,我创建了最佳拟合线的函数。偏差代表y轴截距,权重代表斜率。该模型的目标是用数据点和直线本身之间的最小差异来设置偏差和权重。
第6步:成本函数
#I only have 9 data points in the dataset n_samples = 9 cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
MSE成本函数
此函数是一个MSE(均方误差),显示最佳拟合线与步骤3中给出的数据值之间的距离。图中的m与n_samples相同,表示有多少不同的数据点在集合中。输出越大,预测的Y值与TrainX值的最佳拟合线和TrainX值的TrainY值之间的差异越大。
第7步:设置梯度下降并初始化变
#minimize cost taking steps of 0.01 down the parabola optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
我通过创建优化器变量来设置梯度下降算法,通过改变权重和偏差来最小化成本函数的输出。
第8步:运行会话
#initialize all variables init = tf.global_variables_initializer() with tf.Session() as sess: # Run the initializer sess.run(init)
一旦所有变量都被初始化并设置好所有内容,就应该开始通过初始化所有先前声明的变量来运行实际会话。
第9步:开始优化
# Fit all training data for epoch in range(training_epochs): #zip the training values together into tuples for (x, y) in zip(trainX, trainY): #feed the optimizer the training values sess.run(optimizer, feed_dict={X: x, Y: y})
这两行代码将trainX和trainY的相同索引放入元组并将其发送到优化器,该优化器利用梯度下降来确定如何调整权重以最小化成本。这个过程重复的次数与training_epochs的设置量相同(在本例中为6000次)。
步骤10 :(可选)输出某一时期增量的成本、权重和偏置值
if (epoch+1) % steps == 0: c = sess.run(cost, feed_dict={X: trainX, Y: trainY}) print("Epoch:" + str((epoch+1)), "cost=" + str(c), "W=" + str(sess.run(W)), "b=" + str(sess.run(b)))
我希望在优化过程中每100个步骤看到MSE,权重和偏差值(在步骤2中初始化),因为它帮助我确切了解会话期间发生了什么。
print语句在随机生成的X和Y值集合上的输出
步骤11:用图表上的训练点绘制最佳拟合线
plt.plot(trainX, trainY, 'ro', label='Original data') plt.plot(trainX, sess.run(W) * trainX + sess.run(b), label='Fitted line') plt.legend() plt.show()
首先,绘制我的训练点,然后使用在训练期间确定的权重和偏差值绘制我的最佳拟合线。
绘制的最佳拟合线
这就是模型的全部内容!这里我只使用了9个随机值,但是可以自由地导入一些数据集。选择两个具有相互关联的特征,并使用pandas将其数据值与实际数据集隔离。之后,您可以将一个设置为X变量(独立),将一个设置为Y变量(依赖),并查看两个特征之间的趋势!