Alexnet
Alexnet接收输入位224*224大小的彩色图片数据,经过五个卷积层和三个全连接层后得到样本属于1000个类别的概率分布。为了降低特征图的维度 ,Alexnet在第1、2、5个卷积层后添加了Max Pooling层。网络的参数量达到了60M个。
Alexnet的创新之处:
- 层数达到了较深的8层
- 采用了ReLU激活函数,过去的神经网络大多采用Sigmoid激活,容易出现梯度弥散现象
- 引入Dropout,Dropout提高了模型的泛化能力,防止过拟合
VGG
VGG16接受224*224大小的彩色图片数据,经过2个Conv-Conv-Pooling单元,和3个Conv-Conv-Conv-Pooling单元的堆叠,最后通过3层全连接层输出当前图片分别属于1000类别的概率分布。
VGG的创新之处:
- 层数提升至19层
- 全部采用更小的33卷积核,相对于Alexnet中77的卷积核,参数量更少,计算价更低
- 采用更小的池化层22窗口和步长s=2,而Alexnet中是步长s为2,33的池化窗口
GoogLeNet
GoogLeNet网络采用模块化设计的思想,通过大量堆叠Inception模块,形成了复杂的网络结构。Inception模块的输入是X,通过4个子网络得到4个网络输出,在通道轴上进行拼接,形成Inception模块的输出。
- 1×1卷积层
- 1×1卷积层,再通过一个3×3卷积层
- 1×1卷积层,再通过一个5×5卷积层
- 3×3最大池化层,再通过1×1卷积层
CIFAR10与VGG13实战
import tensorflow as tf
from tensorflow.keras import datasets,losses,optimizers,layers,Sequential
(x,y),(x_test,y_test)=datasets.cifar100.load_data()
y=tf.squeeze(y,axis=1)
y_test=tf.squeeze(y_test,axis=1)
print(x.shape,y.shape,x_test.shape,y_test.shape)
train_db=tf.data.Dataset.from_tensor_slices((x,y))
train_db=train_db.shuffle(1000).map(preprocess).batch(128)
test_db=tf.data.Dataset.from_tensor_slices((x_test,y_test))
test_db=test_db.map(preprocess).batch(128)
def preprocess(x,y):
x=2*tf.cast(x,dtype=tf.float32)/255.-1
y=tf.cast(y,dtype=tf.int32)
return x,y
conv_layers=[
layers.Conv2D(64,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.Conv2D(64,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2,2],strides=2,padding="same"),
layers.Conv2D(128,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.Conv2D(128,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2,2],strides=2,padding="same"),
layers.Conv2D(256,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.Conv2D(256,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2,2],strides=2,padding="same"),
layers.Conv2D(512,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.Conv2D(512,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
layers.MaxPool2D(pool_size=[2,2],strides=2,padding="same")
]
conv_net=Sequential(conv_layers)
fc_net=Sequential([
layers.Dense(256,activation=tf.nn.relu),
layers.Dense(128,activation=tf.nn.relu),
layers.Dense(10,activation=None)
])
conv_net.build(input_shape=[4,32,32,3])
fc_net.build(input_shape=[4,512])
conv_net.summary()
fc_net.summary()
for epoch in range(50):
for step,(x,y) in enumerate(train_db):
with tf.GradientTape() as tape:
logits=model(x)
y_onehot=tf.one_hot(y,depth=10)
loss=tf.losses.categorical_crossentropy(y_onehot,logits,from_logits=True)
loss=tf.reduce_mean(loss)
variables=conv_net.trainable_variables+fc_net.trainable_variables
grads=tape.gradient(loss,variables)
optimizers.apply_gradients(zip(grads,variables))
ResNet
DenseNet
DenseNet将前面所有层的特征图信息通过Skip Connection与当前层输出进行聚合,与ResNet的对应位置相加不同,DenseNet采用在通道轴c维度进行拼接操作,聚合特征信息。