有一說一,VGG19跟ResNet34比起來真的很淺(上圖)。
ResNet全名為Deep Residual Neural Network,
光看翻譯可能不太能理解甚麼是「殘差網路」,
所以今天師爺我就來翻譯翻譯,什麼叫「殘差網路」。
以下表格中,最中間的就是resnet50的結構,
可以分成幾個部分:
ResNet-152在ImageNet上達到了5.71% top-5 error,
狠狠甩開VGG-16和GoogLeNet,
上表看起來也是152 > 101 > 50。
那為何不要直疊一個1000層的神經網路呢?
上圖為ResNet作者在CIFAR-10上的實驗結果,
ResNet-1202的表現甚至比ResNet-56還差。
沒錯,就是這麼簡單其實就是import不同的模組XD
from tensorflow.keras.applications import ResNet50
def build_model(preModel=ResNet50, num_classes=7):
pred_model = preModel(include_top=False, weights='imagenet',
input_shape=(48, 48, 3),
pooling='max', classifier_activation='softmax')
output_layer = Dense(
num_classes, activation="softmax", name="output_layer")
model = tf.keras.Model(
pred_model.inputs, output_layer(pred_model.output))
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.CategoricalCrossentropy(), metrics=['accuracy'])
return model
ResNet帶給我的啟示是這樣的:
人們知道模型加深可以提高準確率,
但是加深會有許多困難要克服,
例如:1.參數量變大、2.推論時間變久、3.梯度消失嚴重、4.硬體設備不足。
這些困難導致模型無法訓練成功。
而殘差網路+bottleneck看似解決了1.和3.,
但也只是減緩模型加深的帶來的困難,而非完全解決。
但是ResNetv2對ResNetv1做了改善,
讓模型疊到1001層(ResNet-1001[ours])也能夠成功訓練。
如下圖所示: