Tensorflow2.1.0最简教程
Tensorflow2.0主要的特性
1.使用tf.keras和eager mode进行更加简单的模型构建
2.鲁棒的跨平台模型部署
3.强大的研究实验
4.清除不推荐使用的API和减少重复来简化API
Tensorflow2.0的架构
Tensorflow2.0的开发流程
1.使用tf.data加载数据
2.1使用tf.keras构建模型,也可以使用premade estimator来验证模型
2.2使用tensorflow hub进行迁移学习
3.使用eager mode进行运行和调试
4.使用分布策略来进行分布式训练
5.导出SavedModel
6.使用tensorflow Server、tensorflow lite、tensorflow.js部署模型
Tensorflow 第一个程序
1+1/2+1/4+1/8……
import tensorflow as tf #引入tensorflow包
print (tf.__version__) #打印tensorflow版本
x = tf.Variable(0.) #设置变量x
y = tf.Variable(1.) #设置变量y
for i in range(50): #python循环
x = x+y #操作1
y = y/2 #操作2
print(x.numpy()) #以numpy的格式输出x
实现以上操作的基础使用
1 . 设置变量(Variable)
x = tf.Variable(0.)
2.操作
x = x+y #直接像python一样操作就行
3.输出
print(x.numpy()) #以numpy的格式输出x
4.额外的知识张量
A = tf.constant([[1., 2.], [3., 4.]])#就是多维数组类型的变换而已
模型搭建
1.理论
1.1keras是什么
keras是python的高级神经网络API
1.2损失函数
损失函数就是衡量预测值与真实值之间的差距
常见的有
平方差损失(分类/回归)
交叉熵(分类)
绝对值损失(回归)
举个例子
1.3激活函数
我们搭建的模型一般只能处理线性输出(y = kx+b)
而我们处理的函数多少都是曲线
这时候就需要激活函数“掰弯”才能用
引用百度百科
激活函数(Activation functions)对于人工神经网络 [1] 模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如图1,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了
2.代码片段
2.1 引入库文件
import tensorflow as tf
from tensorflow import keras
2.2获取数据并拆分成训练集和测试集
# 获取数据集,没有会下载
fashion_mnist = keras.datasets.fashion_mnist
(x_train_all, y_train_all), (x_test,y_test) = fashion_mnist.load_data()#拆分数据集
#x_train_all , x_text= x_train_all / 255 ,x_test /255#对模型进行归一化(让数据全变成1以内显著提高模型训练准确率)
2.3sklearn数据标准化
#
from sklearn.preprocessing import StandardScaler#导入库文件
scaler = StandardScaler()#创建实例
train_scaled = scaler.fit(data)#学习到训练集的均值和方差(测试集,验证集都要用训练集的均值和方差)
train_scaled = scaler.fit_transform(data)#学习到训练集的均值和方差同时标准化数据
train_scaled = scaler.transform(data)#标准化数据(必须先学习均值和方差)
2.4创建模型
2.4.1创建框架
#创建模型
model = keras.models.Sequential() #先生成一个模型框架
2.4.2 创建输入层
#往框架中加入输入层
model.add(keras.layers.Flatten(input_shape = [28,28]))#定义输入层
#输入层将矩阵全部变成一维向量,变化之前的维度需要定义
# input_shape=x_train.shape[1: ]输入层的形状这么写可以省不少麻烦
2.4.3创建隐藏层
2.4.3.1 全连接
model.add(keras.layers.Dense(128,activation = "relu"))
#创建全链接层,有128个神经元,激活函数设定为relu
2.4.3.2 批归一化
model.add(keras.layers.BatchNormalization())#增加批归一化,这样更好的解决深度学习中的梯度消失问题
2.4.3.3 激活函数
model.add(keras.layers.Activation('relu'))#增加激活函数,增加模型处理非线性问题的能力
2.4.3.4 Dropout
model.add(keras.layers.AlphaDropout(rate = 0.5))#更强大的Dropout,随机删除节点,增加模型对抗过拟合的能力
model.add(keras.layers.Dropout(rate = 0.5))#普通的Dropout
2.4.3.1 展平数据
model.add(keras.layers.Flatten())#将数据展平
2.4.4创建输出层
model.add(keras.layers.Dense(10,activation = "softmax"))
#创建输出层,因为是分类模型所以用softmax将输出转化成概率
2.5定义模型调整策略
model.compile(optimizer='adam',#求解模型的方法
loss='sparse_categorical_crossentropy',#损失函数必须是向量如果已经是向量可省略sparse_
metrics=['accuracy'])#将其他参数加入到图中,并将图固化
2.6训练
history = model.fit(x_train_all, y_train_all,epochs = 5, #history用来接收训练过程中的一些参数数值 #训练的参数#训练5遍
validation_data = (x_test,y_test) )#实时展示模型训练情况
2.7回调函数
import tensorflow as tf
from tensorflow import keras
import os #包含相应的库文件
logdir = './callbacks'#定义TensorBoard需要的文件夹名称
if not os.path.exists(logdir):
os.mkdir(logdir)#如果没有就创建文件夹
output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")#ModelCheckpoint所需要的模型文件名称
callbacks = [
keras.callbacks.TensorBoard(logdir)#TensorBoard训练过程的可视化
,keras.callbacks.ModelCheckpoint(output_model_file,save_bast_only = True)#模型保存,第二个参数是True则保存最有模型,False保存最近模型
,keras.callbacks.EarlyStopping(monitor='val_loss',min_delta = 1e-3,patience = 5)#定义在什么时候停止训练(对哪个值进行检测/小于几/出现几次停止训练)(检测值有:acc/正确率,val_acc/验证集准确率,loss/损失率,acc_loss,验证集损失率)
]
#使用时需要在训练模型的model.fit()函数里加入参数callbacks = callbacks
#使用的时候进入程序所在文件夹输入 tensorboard --logdir=callbacks 然后在浏览器登录命令行提示的网址就可以了
2.8其他额外的应用(可视化,打印信息)
2.8.1显示单张图片
def show_single_image(img_arr):
plt.imshow(img_arr,cmap = "binary")
plt.show()
show_single_image(x_train_all[0])#输入参数是图片的数据
2.8.2显示多张图片
def show_imgs(n_rows,n_cols,x_data,y_data,class_name):
assert len(x_data) == len(y_data)
assert n_rows * n_cols < len(x_data)
plt.figure(figsize = (n_cols * 1.4,n_rows * 1.6))
for row in range(n_rows):
for col in range(n_cols):
index = n_cols * row + col
plt.subplot(n_rows,n_cols,index+1)
plt.imshow(x_data[index], cmap = "binary",interpolation = "nearest")
plt.axis('off')
plt.title(class_names[y_data[index]])
plt.show()
class_names = ['T-shirt','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']#必须规定class_names才能使用
show_imgs(10,10,x_train_all,y_train_all,class_name)#输入参数分别是几行、几列、图片数据、对应分类、分类名称所在列表
2.8.3打印层概况、模型架构
model.summary()#打印模型架构
model.layers# 输出层概况
2.8.4打印模型训练曲线
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8,5))
plt.grid(True)
plt.gca().set_ylim(0,1)
plt.show()
plot_learning_curves(history)#(输入训练时的返回值)
超参数搜索
用sklearn封装model
#定义函数和默认值
def build_model(hidden_layers = 1,
layer_size = 30,
learning_rate = 3e-3):
#创建一个模型
model = keras.models.Sequential()
#定义层结构
model.add(keras.layers.Dense(layer_size,activation='relu',
input_shape = x_train.shape[1:]))
for _ in range(hidden_layers-1):
model.add(keras.layers.Dense(layer_size,
activation = 'relu'))
model.add(keras.layers.Dense(1))
optimizer = keras.optimizers.SGD(learning_rate)
#定义模型的解决方案
model.compile(loss = 'mse',optimizer = optimizer)
#返回整个模型
return model
#用模型sklearn接收模型(KerasClassifier分类、KerasRegressor回归)
sklearn_model = keras.wrappers.scikit_learn.KerasRegressor(build_model)
超参数训练模型
#GridSearchCV穷尽网格测试
#RandomizedSearchCV随机参数搜索
#引入分布函数
from scipy.stats import reciprocal#reciprocal分布函数表达式f(x) = 1/(x*log(b/a)) a<=x<=b
# 定义参数范围
param_distribution = {
"hidden_layers":[1,2,3,4],
"layer_size":np.arange(1,100),
"learning_rate":reciprocal(1e-4,1e-2),
}
from sklearn.model_selection import RandomizedSearchCV#包含必须的库文件
random_search_cv = RandomizedSearchCV(sklearn_model, #哪个模型
param_distribution,#参数范围
n_iter = 10,#随机取几组
n_jobs = 1)#并行数
#此处的训练参数和keras一模一样
random_search_cv.fit(x_train_scaled,y_train,epochs = 100,
validation_data = (x_valid_scaled,y_valid),
callbacks = callbacks)
#可以对reciprocal分布参数进行查看,并输出训练后的最优参数:
print(random_search_cv.best_params_)#打印最优参数
print(random_search_cv.best_score_)#打印最优评分
print(random_search_cv.best_estimator_)#打印最优模型
#最后进行对最优model的测试:
model = random_search_cv.best_estimator_.model#使用最优秀的模型
model.evaluate(x_test_scaled,y_test)#对模型进行评价
遗传算法调参
#定义参数范围
paramgrid = {"kernel": ["rbf"],
"C" : np.logspace(-9, 9, num=25, base=10),
"gamma" : np.logspace(-9, 9, num=25, base=10)}
#引入必须的库文件
from evolutionary_search import EvolutionaryAlgorithmSearchCV
#遗传算法调优
cv = EvolutionaryAlgorithmSearchCV(estimator=SVC(), #模型是哪个
params=paramgrid,#参数范围
scoring="accuracy",#评分
cv=StratifiedKFold(n_splits=4),
verbose=1,
population_size=50,#人口规模
gene_mutation_prob=0.10,#一般突变
gene_crossover_prob=0.5,#基因重组
tournament_size=3,#比赛规模
generations_number=5,#世代数
n_jobs=4)