Bootstrap

创建网络的若干方式

keras.models.Sequential() ()

适用于简单线性堆叠网络。
流程:创建Sequential()对象,逐层堆叠网络

import tensorflow as tf
from tensorflow.keras import layers, models

model = models.Sequential()

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

model.summary()

也可以不使用.add方法。直接在Sequntial里放入层列表

import tensorflow as tf
from tensorflow.keras import layers, models

model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model.summary()

在这里插入图片描述
注意:input_shape=(32, 32, 3),在模型搭建过程中会自动填空Batch维度,即None。而不需要在定义input_shape的时候进行定义。
第一列中的层名是按照层的类型默认1开始的序列后缀命名。

keras.models.Model()

如果我们像实现一些更为复杂的网络,比如多输入多输出的模型就需要使用到keras.models.Model()来构建网络。如下代码同时输出最后卷积层Flatten后提取的特征层,以及分类结构。
流程使用keras.Input定义输入张量shape, 创建网络层;定义每层的输入和输出张量;keras.models.Model确定输入张量和输出层,keras可以根据每一层的输入输出关系完成整个网络图的创建。

import tensorflow as tf
from tensorflow.keras import layers, models, Input

input_tensor = Input(shape=(32, 32, 3))

x = layers.Conv2D(32, (3, 3), activation='relu')(input_tensor)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.Conv2D(64, (3, 3), activation='relu')(x)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.Conv2D(64, (3, 3), activation='relu')(x)

output_tensor1=layers.Flatten()(x)
x = layers.Dense(64, activation='relu')(output_tensor1)

output_tensor2 = layers.Dense(10, activation='softmax')(x)

model = models.Model(inputs=input_tensor, outputs=[output_tensor1, output_tensor2])

model.summary()

在这里插入图片描述
第一层卷积核参数:896=((3x3)x3+1)x32
第二层卷积核参数:18496=((3x3)x32+1)x64
第三个卷积核参数:36928=((3x3)x64+1)x64
(卷积核面积x上一层层数+1)x下一层层数
加1表示bias
可以看出CNN网络参数只与卷积核的尺寸,以及相邻特征层的层数有关,因此理论上,网络可以对不同尺寸的图像进行特征提取,但是由于Tensorflow是静态图,会指定输入尺寸。这里就体现了Pytorch动态图优势。

第一个全连接层参数:1024x(64+1)=65600
第二个全连接层参数:10x(64+1)=650
(上一层层数+1)x下一层层数

分析:卷积层params=(卷积核权值+偏置)卷积核个数=(高深度+1)32=(333+1)*32

;