05_快速上手tf.keras第一部分:实现回归模型

本篇使用tf.keras实现简单的线性回归模型与非线性回归模型,以快速上手tf.keras API

本部分使用到的主要相关API:

  • tensorflow.keras.models.Sequential
  • tensorflow.keras.layers.Dense
  • tensorflow.keras.layers.Activation
  • tensorflow.keras.optimizers.SGD

1.使用tf.keras实现线性回归模型

1.1 首先导入需要的包和函数

import tensorflow as tf 
import numpy as np
import matplotlib.pyplot as plt
# keras顺序构成的模型
from tensorflow.keras.models import Sequential
# Dense全连接层
from tensorflow.keras.layers import Dense

使用tf.keras就不直接import keras了,而是从tensorflow.python.keras下导入相关API。SequentialKeras模型中较为常用的,它在keras.model模块下,通过该模型可以以搭积木的方式快速的构建神经网络模型。Dense是全连接层的API,具体使用见下面的代码。

1.2 利用numpy生成实验数据

#生成100个随机点 y=0.1x+0.2
x_data = np.random.rand(100)
noise = np.random.normal(0,0.01,x_data.shape)
y_data = x_data*0.1+0.2+noise

#显示随机点
plt.scatter(x_data,y_data)
plt.show()

这里使用numpy来生成实验所需的训练集数据,生成的数据如下:
在这里插入图片描述

1.3搭建模型

model = Sequential()
# units输出维度 input_dim输入维度
model.add(Dense(units=1,input_dim=1))
model.compile(optimizer='sgd',loss='mse')
model.summary()

modelSequential()的实例化对象,后续可以直接使用它的add方法来给模型增加指定的层,如全连接层或者卷积层,模型搭建完成后使用compile方法来编译模型,如代码所示,可以在里面配置优化器和损失方法。summary方法可以输出网络模型,包括参数个数等信息,可以看见,网络就一层,可训练参数两个,如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 1)                 2         
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________

1.4 训练模型

for step in range(10001):
    cost = model.train_on_batch(x_data,y_data)
    if step%1000 ==0:
        print('cost:',cost)
        
W,b=model.layers[0].get_weights()
print('W:',W,'b:',b)

#预测值
y_pred = model.predict(x_data)
plt.scatter(x_data,y_data)
plt. plot(x_data,y_pred,'r-',lw=3)
plt.show()

这里迭代了10000次,train_on_batch方法可以将封装好格式的数据输入进模型供以训练,最终结果:
在这里插入图片描述

本节完整代码:
01_linear_regression.py

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

import tensorflow as tf 
# config GPU
# tf.debugging.set_log_device_placement(True)
phy_gpus = tf.config.experimental.list_physical_devices('GPU')
print("num of physical gpus: ",len(phy_gpus))
for gpu in phy_gpus:
   tf.config.experimental.set_memory_growth(gpu,True)

import numpy as np
import matplotlib.pyplot as plt
# keras顺序构成的模型
from tensorflow.keras.models import Sequential
# Dense全连接层
from tensorflow.keras.layers import Dense

# 利用numpy生成100个随机点
x_data = np.random.rand(100)
noise = np.random.normal(0,0.01,x_data.shape)
y_data = x_data*0.1+0.2+noise

# 显示随机点
plt.scatter(x_data,y_data)
plt.show()

# 构建模型
model = Sequential()
# units输出维度 input_dim输入维度
model.add(Dense(units=1,input_dim=1))
model.compile(optimizer='sgd',loss='mse')
model.summary()

# 训练模型
for step in range(10001):
    #print(step)
    cost = model.train_on_batch(x_data,y_data)
    if step%100 ==0:
        print('cost:',cost)
        
W,b=model.layers[0].get_weights()
print('W:',W,'b:',b)

#预测值
y_pred = model.predict(x_data)
plt.scatter(x_data,y_data)
plt. plot(x_data,y_pred,'r-',lw=3)
plt.show()

PS: 代码中有一段是上面没有介绍的,这一段是设置GPU按需分配的,因为默认情况下,即使只用一点点GPU keras也会把显存都沾满。tf.debugging.set_log_device_placement(True)可以将每一步使用的设备打印出来,而 tf.config.experimental.list_physical_devices('GPU')则可以返回电脑上所有的物理GPU,使用tf.config.experimental.set_memory_growth(gpu,True)来给指定的GPU设置按需占用显存策略。

2.使用tf.keras实现非线性回归模型

2.1导入相应的包:

import tensorflow as tf 
import numpy as np
import matplotlib.pyplot as plt
# keras顺序构成模型
from tensorflow.keras.models import Sequential
# Dense全连接层
from tensorflow.keras.layers import Dense,Activation
# 导入SGD优化器
from tensorflow.keras.optimizers import SGD

2.2利用numpy生成200个随机点

x_data = np.linspace(-0.5,0.5,200)
noise = np.random.normal(0,0.02,x_data.shape)
y_data = np.square(x_data)+noise
plt.scatter(x_data,y_data)
plt.show()

结果如下图:
在这里插入图片描述

2.3搭建模型:

model = Sequential()
#定义优化算法
sgd = SGD(lr=0.1)

#构建一个1-10-1结构的网络
model.add(Dense(units=10,input_dim=1))
model.add(Activation('tanh'))
model.add(Dense(units=1,input_dim=10))
model.add(Activation('tanh'))

#编译模型,打印出模型结构
model.compile(optimizer=sgd,loss='mse')
model.summary()

输出如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 10)                20        
_________________________________________________________________
activation (Activation)      (None, 10)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 11        
_________________________________________________________________
activation_1 (Activation)    (None, 1)                 0         
=================================================================
Total params: 31
Trainable params: 31
Non-trainable params: 0
_________________________________________________________________

这里讲一下调整学习率的方法,默认lr=0.01,首先导入SGD:
from keras.optimizers import SGD
然后定义一个sgd:
sgd=SGD(lr=0.1)
然后赋给optimizer就可以了。

2.4 训练模型

for step in range(10001): 
    cost=model.train_on_batch(x_data,y_data)
    if step%500==0:
        print("cost",cost)
              
y_pred = model.predict(x_data)
plt.scatter(x_data,y_data)
plt. plot(x_data,y_pred,'r-',lw=3)
plt.show()

最终结果如下:

在这里插入图片描述

本节完整代码:
02_linear_nonregression.py

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值