2019年7月26日 星期五

[DL][CNN] 觀念整理(未完成)

CNN 觀念整理


why CNN?
通常影像多媒體資料過大, 直接使用DNN, 要做full connect layer, 光建立一層就跑不下去了, 所要訓練資料過大過慢

與DNN差別?
只萃取部分資訊, 透過卷積, 產生多張feature map 降低計算量

萃取資訊?
model中較早出現的層萃取局部高通用性的特徵圖(可視邊緣. 顏色. 紋理),  較深入的層會萃取更抽象的概念(貓耳朵. 狗眼), 如果新資料及與訓練資料及差別過大, 最好使用model前幾層來萃取特徵

fine-tuning
只微調最後幾層有特定特徵的層效果會更好, 前面層的通用特徵建議保留, convolution base的表示法可能是可以通用的, 但Dense層無空間概念, 保存下來沒有用, 其他如分類器亦同
流程:

  1. 在已經訓練過的base上增加自訂義的神經網路
  2. 凍結卷積base
  3. 訓練自定義分類層
  4. 解凍最後幾層
  5. 訓練解凍層與分類器, 並以較低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:

  • Deep learning 深度學習必讀:Keras 大神帶你用 Python 實作

沒有留言:

張貼留言