基于Tensorflow keras的线性回归和非线性回归

基于tensorflow keras的线性回归:

import keras  #导入keras
import numpy as np #导入numpy用于提供多维数组模型
import matplotlib.pyplot as plt #导入画图的工具包
from keras.models import Sequential #Sequential 按顺序构成的模型,输出层--隐藏层--输出层
from keras.layers import Dense #Dense全连接层


#使用numpy生成200个随机点
x_data = np.random.rand(200)
#添加噪音就是一些随机值,normal是正态分布,0表示均值,0.01表示方差,输出类似于x_data
noise = np.random.normal(0,0.01,x_data.shape)
#要构造一个线性模型,就是x乘斜率+截距,这里随便设置斜率为0.1,截距为0.2
y_data = x_data*0.1+0.2+noise


plt.scatter(x_data,y_data)#显示随机点,scatter是用来生成散点图的
plt.show() #画出图像


#构建一个顺序模型
model = Sequential()
'''在模型中添加一个全连接层
units=1表示输出是1维的,input_dim表示输入是1维的,就是输入一个x的值会输出一个y的值'''
model.add(Dense(units=1,input_dim=1))
'''optimizer是表示优化器,使用的是sgd就是随机梯度下降法,
loss是损失函数,mse就是均方误差'''
model.compile(optimizer='sgd',loss = 'mse')

#训练
#训练5000批次
for step in range(5000):
    #因为数据不是很多,所以一个批次就把所有的数据都训练了
    model.train_on_batch(x_data,y_data)

#打印权值W和偏置值b
#这里只有一个层就是layers[0]
W,b = model.layers[0].get_weights()
print("W:",W,"b:",b)

#把x_data输入网络中得到预测值y_pred
y_pred = model.predict(x_data)

#显示随机点
plt.scatter(x_data,y_data)
#显示预测结果
plt.plot(x_data,y_pred,'r',linewidth=3)
plt.show() #画出图像

其初始线性模型的图如下所示:

基于Tensorflow keras的线性回归和非线性回归_第1张图片

训练完之后,得到的预测模型如下图所示:

基于Tensorflow keras的线性回归和非线性回归_第2张图片

得到的权值和偏执值:

基于tensorflow keras的非线性回归:

import keras  #导入keras
import numpy as np  #导入numpy用于提供多维数组模型
import matplotlib.pyplot as plt  #导入画图工具报
from keras.models import Sequential #Sequential 按顺序构成的模型,输出层--隐藏层--输出层
from keras.layers import Dense #Dense全连接层
from keras.optimizers import gradient_descent_v2 #从优化器中导入梯度下降法


#使用numpy生成200个随机点
#在-0.5到+0.5之间生成200个点,这200个点是均匀分布的
x_data = np.linspace(-0.5,0.5,200)
#生成噪声,normal是正态分布,0表示均值,0.02表示方差,输出类似于x_data
noise = np.random.normal(0,0.02,x_data.shape)
#由于是非线性,所以将y设置成x开平方加噪音
y_data = np.square(x_data)+noise;

#显示随机点
plt.scatter(x_data,y_data)
plt.show() #画出图像




#构建一个顺序模型
model = Sequential()
'''在模型中添加一个全连接层,
输出是1个神经元,输出是1个神经元,在模型中加入一个隐藏层,有10个神经元,1-10-1'''
#这里units=10表示隐藏层有10个神经元,intput_dim输入是1个神经元,activation表示激活函数,使用的是tanh,双曲正切函数
model.add(Dense(units=10,input_dim=1,activation='tanh'))  #隐藏层
#这里units为输出,可以不再重复设置输入
model.add(Dense(units=1,activation='tanh'))  #输出层

#定义优化算法
sgd=gradient_descent_v2.SGD(lr=0.3) #使用随机梯度下降法,lr就是学习率,定义为0.3,其默认为0.01
#optimizer是优化器,loss是损失函数,mse表示均方误差
model.compile(optimizer=sgd,loss = 'mse')



#训练
#训练7000批次
for step in range(7000):
    #因为数据不是很多,所以一个批次就把所有的数据都训练了
    cost = model.train_on_batch(x_data,y_data)
    if step%500==0:#每循环500次打印cost的值
        print('cost:',cost)


#把x_data输入网络中得到预测值y_pred
y_pred = model.predict(x_data)

#显示随机点
plt.scatter(x_data,y_data)
#显示预测结果
plt.plot(x_data,y_pred,'r',linewidth=3)
plt.show() #画出图像




初始随机点图像输入所示:

 基于Tensorflow keras的线性回归和非线性回归_第3张图片

训练完之后的到的预测模型输入所示:

基于Tensorflow keras的线性回归和非线性回归_第4张图片

从图可以看出使用的双曲正切激活函数还是能比较正确的拟合点的分布;

如果使用rule激活函数:

model.add(Dense(units=10,input_dim=1,activation='relu'))  #隐藏层
#这里units为输出,可以不再重复设置输入
model.add(Dense(units=1,activation='relu'))  #输出层

最后得到的结果如下:

 基于Tensorflow keras的线性回归和非线性回归_第5张图片

你可能感兴趣的:(tensorflow,keras,线性回归)