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。Sequential
是Keras
模型中较为常用的,它在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()
model
是Sequential()
的实例化对象,后续可以直接使用它的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