Tensorflow2.0 Keras高级接口之Sequential网络容器

Tensorflow2.0 Keras高级接口之网络容器

对于常见的网络,需要手动调用每一层的类实例完成前向传播运算,当网络层数变得较深时,这一部分代码显得非常臃肿。可以通过Keras 提供的网络容器Sequential 将多个网络层封装成一个大网络模型,只需要调用网络模型的实例一次即可完成数据从第一层到最末层的顺序传播运算。

例如,2 层的全连接层加上单独的激活函数层,可以通过Sequential 容器封装为一个网络。

# 导入Sequential 容器
from tensorflow.keras import layers, Sequential
network = Sequential([ # 封装为一个网络
layers.Dense(3, activation=None), # 全连接层,此处不使用激活函数
layers.ReLU(),#激活函数层
layers.Dense(2, activation=None), # 全连接层,此处不使用激活函数
layers.ReLU() #激活函数层
])
x = tf.random.normal([4,3])
out = network(x) # 输入从第一层开始,逐层传播至输出层,并返回输出层的输出

Sequential 容器也可以通过add()方法继续追加新的网络层,实现动态创建网络的功能:

layers_num = 2 # 堆叠2 次
network = Sequential([]) # 先创建空的网络容器
for _ in range(layers_num):
	network.add(layers.Dense(3)) # 添加全连接层
	network.add(layers.ReLU())# 添加激活函数层
	network.build(input_shape=(4, 4)) # 创建网络参数
network.summary()

上述代码通过指定任意的layers_num 参数即可创建对应层数的网络结构,在完成网络创建时,网络层类并没有创建内部权值张量等成员变量,此时通过调用类的build 方法并指定输入大小,即可自动创建所有层的内部张量。通过summary()函数可以方便打印出网络结构和参数量,打印结果如下:
在这里插入图片描述
可以看到Layer 列为每层的名字,这个名字由TensorFlow 内部维护,与Python 的对象名并不一样。Param#列为层的参数个数,Total params 项统计出了总的参数量,Trainable params为总的待优化参数量,Non-trainable params 为总的不需要优化的参数量。读者可以简单验证一下参数量的计算结果。

当我们通过Sequential 容量封装多个网络层时,每层的参数列表将会自动并入Sequential 容器的参数列表中,不需要人为合并网络参数列表,这也是Sequential 容器的便捷之处。Sequential 对象的trainable_variables 和variables 包含了所有层的待优化张量列表和全部张量列表,例如:

In [3]: # 打印网络的待优化参数名与shape
for p in network.trainable_variables:
	print(p.name, p.shape) # 参数名和形状
Out[3]:
dense_2/kernel:0 (4, 3)
dense_2/bias:0 (3,)
dense_3/kernel:0 (3, 3)
dense_3/bias:0 (3,)

Sequential 容器是最常用的类之一,对于快速搭建多层神经网络非常有用,应尽量多使
用来简化网络模型的实现。

发布了62 篇原创文章 · 获赞 33 · 访问量 3476

猜你喜欢

转载自blog.csdn.net/python_LC_nohtyp/article/details/104272802
今日推荐