前面我们主要是使用tensorflow的原生代码来模拟搭建神经网络,其实就是定义出神经网络中的各个参数,然后模拟前向传播和参数更新过程来训练模型,最终达到我们想要的效果;这样做当然是可以的,并且符合我们脑中的想象过程,但是有一个弊端就是编码复杂,并且随着神经网络层数的增加,编码的工作量也大幅增长,不是我们想要的结果,并且大多人在TensorFlow中也不是这样做的,TensorFlow为我们提供了创建神经网络的API,我们只需要调用即可构建神经网络,极大的便利了我们的工作,在TensorFlow中主要是使用keras来构建神经网络,下面将进行介绍。
搭建神经网络的六步法(使用Sequential方法)
-
首先import相关模块
-
处理训练集和测试集数据,便于下面的操作
-
使用model=tf.keras.models.Sequential()搭建网络结构
使用这个函数主要是逐层描述每层网络,相当于走了一遍前向传播;我们可以认为Sequential是一个容器,在这个容器中封装了一个神经网络结构,使用是我们需要描述从输入层到输出层的每层网络结构;这里每一层的网络结构可以是拉直层tf.keras.layers.Flatten(),这里的拉直层不含计算,只是将输入特征拉直为一维数组,也可以是全连接层tf.keras.layers.Dense(),具体的描述方法如下:
import tensorflow as tf
tf.keras.layers.Dense(神经元个数,activation="激活函数",kernel_regularizes=哪种正则化)
其中activation是以字符串的形式给出,可选relu,softmax,sigmoid,tanh;
kernel_regularizes可选tf.keras.regularizes.I1()或tf.keras.regularizes.I2();
还可以是卷积层tf.keras.layers.Conv2D(),具体描述如下:
import tensorflow as tf
tf.keras.layers.Conv2D(filters=卷积核个数,kernel_size=卷积核尺寸,strides=卷积步长,padding="valid"or"same")
- 使用model.compile()函数配置训练方法
主要是告知训练器选择哪种优化器,选择哪个损失函数,选择哪种评测指标,主要使用方法如下图所示:
- 使用model.fit()函数执行训练过程
在这里需要告知训练集和测试集的输入特征和标签等信息;具体方法如图所示:
- 使用model.summary()打印出网络的结构和参数统计
使用类class搭建神经网络结构
和上面的六部法是一样的,不同之处在于第三步,sequential描述的是顺序网络结构,无法写出带有跳连的非顺序网络结构,这时可以用class类来搭建网络结构,方法如下所示:
#模板如下
class Mymodel(Model):
def __init__(self):
super(Mymodel,self).__init__()
#定义网络结构
def call(self,x):
#调用网络结构块,实现前向传播
return y
#具体实例
class mymodel(Model):
def __init__(self):
super(mymodel,self).__init__()
self.d1=Dense(3)
def call(self,x):
y=self.d1(x)
return y
断点续训
我们训练了一个模型之后,将相关的参数都更新到了一个较优的值,下一次我们希望的是可以接着使用这些值而不是重新再去训练这个模型,断点续训就是这个意思,我们可以将之前训练好的参数保存起来,下次使用该模型的时候可以直接读取使用并从该基础上继续训练模型。
保存模型
import tensorflow as tf
cp_callback=tf.keras.callbacks.ModelCheckpoint(
filepath=保存路径名,
save_weights_only=true/false,#告知是否只保留参数
save_best_only=true/false) #告知是否只保留最优参数
history=model.fit(callbacks=cp_callback)#在fit方法中加入callbacks参数
读取模型
读取模型使用model.load_weights(路径名),具体使用方法如下:
import os
path="../canshu.ckpt"
if os.path.exists(path+".index"):
model.load_weights(path)
参数查看
上面的模型参数被保存到了ckpt文件中,我们无法直接查看,我们希望参数数据以我们习惯的方法展示出来,TensorFlow为我们提供了方法,model.trainable_variables返回模型中的可训练参数,我们可以直接打印查看,有是有模型参数过多的时候,我们使用print方法会展示不全,我们只需要提前进行一下设置即可:np.set_printoptions(threshold=np.inf),这样再使用print打印就会显示全了,我们同样可以将相关参数保存到文本文件中,以便于查看和分析,方法如下:
file=open('weight.txt','w')
for v in model.trainable_variables:
file.write(str(v.name)+'/n')
file.write(str(v.shape)+'/n')
filw.write(str(v.numpy())+'/n')
file.close()