CNN 觀念整理
why CNN?
通常影像多媒體資料過大, 直接使用DNN, 要做full connect layer, 光建立一層就跑不下去了, 所要訓練資料過大過慢
與DNN差別?
只萃取部分資訊, 透過卷積, 產生多張feature map 降低計算量
萃取資訊?
model中較早出現的層萃取局部高通用性的特徵圖(可視邊緣. 顏色. 紋理), 較深入的層會萃取更抽象的概念(貓耳朵. 狗眼), 如果新資料及與訓練資料及差別過大, 最好使用model前幾層來萃取特徵
只微調最後幾層有特定特徵的層效果會更好, 前面層的通用特徵建議保留, convolution base的表示法可能是可以通用的, 但Dense層無空間概念, 保存下來沒有用, 其他如分類器亦同
流程:
- 在已經訓練過的base上增加自訂義的神經網路
- 凍結卷積base
- 訓練自定義分類層
- 解凍最後幾層
- 訓練解凍層與分類器, 並以較低learning rate才不會破壞之前的表示法(RMSprop=lr=le-5)
# 將所有層凍結到指定層為止 from keras.applications import VGG16 conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3)) conv_base.summary() conv_base.trainable = True set_trainable = False for layer in conv_base.layers: if layer.name == 'block5_conv1': set_trainable = True if set_trainable: layer.trainable = True else: layer.trainable = False # 微調神經網路 # 編譯模型 model.compile( loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=1e-5), metrics=['acc']) # 訓練模型 history = model.fit_generator( train_generator, steps_per_epoch=100, epochs=100, validation_data=validation_generator, validation_steps=50) # 使用測試資料來評估微調後的 model test_generator = test_datagen.flow_from_directory( test_dir, target_size=(150, 150), batch_size=20, class_mode='binary') test_loss, test_acc = model.evaluate_generator(test_generator, steps=50) print('test acc:', test_acc)
建構輕量的深度可分離卷積神經網路 一般的CNN很快會被速度更快能力更高的深度可分離CNN取代(SeparableConv2D)為Cov2D取代品
from keras.models import Sequential, Model from keras import layers height = 64 width = 64 channels = 3 num_classes = 10 model = Sequential() model.add(layers.SeparableConv2D(32, 3, activation='relu', input_shape=(height, width, channels))) model.add(layers.SeparableConv2D(64, 3, activation='relu')) model.add(layers.MaxPool2D(2)) model.add(layers.SeparableConv2D(64, 3, activation='relu')) model.add(layers.SeparableConv2D(128, 3, activation='relu')) model.add(layers.MaxPooling2D(2)) # model.add(layers.SeparableConv2D(64, 3, activation='relu')) # 怪怪的 model.add(layers.SeparableConv2D(128, 3, activation='relu')) model.add(layers.GlobalAveragePooling2D()) model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(num_classes, activation='softmax')) # model.compile(optimizer='rmsprop', loss='categorical_crossentropy') model.summary()
Ref:
沒有留言:
張貼留言