CNN


学習内容


CNN


猫の視覚皮層の受容領域からインスピレーションを得る
コンボリューション層とマージ層を組み合わせたものです.

  • ボリューム:所与のデータをフィルタリングし、乗算と加算演算を計算することによってデータ特徴を抽出する方法.

  • filter:最小のフィーチャーをキャプチャするウェイトのセットからなるウィンドウ.

  • padding:畳み込み後、フィルタの形状によってデータが減少することを防止するため、データエッジに0を付けて畳み込む方式をzero paddingと呼ぶ.

  • strateg:ボリュームはフィルタを順番に移動して計算し、一度に移動する距離はstreepと指定できます.
  • import numpy as np
    #import scipy.ndimage as nd 를 통해서도 convolve계산 가능
    
    input = [0, 0, 26, 51, 58, 59, 53, 29, 0, 0, 0]
    patch = [-1, 2, -1]
    
    output = np.convolve(input, patch)
    print(output)

  • pooling:特徴を抽出する過程ともいえる.より詳細には、ボリュームから抽出された特徴の特徴を見つけることができる.
  • 効果
  • オーバーフィット
  • を低減
  • inputsizeを減らし、
  • を効果的に学ぶ
  • プールを使用すると、特定の形状をよりよく認識できます:
  • from skimage.measure import block_reduce
    
    reduced = block_reduce(combined, (2,2), np.max)
    plt.imshow(reduced, cmap="gray");

  • CNNの長所
  • 前処理(切断/センチメートル化、正規化など)は相対的にほとんど必要ない.
  • 画像のすべてのタイプの一般的な問題(移動、照明など)に対して堅牢である.

  • 実習
  • #이미지는 32X32X3 형태로 입력됨.
    
    model = Sequential()
    model.add(Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)))
    #3X3 filter로 32개의 feature를 뽑겠다.
    #파라미터 개수 : (3X3X32) X 3(입력채널) + 32(출력채널 편향)
    model.add(MaxPooling2D((2,2)))
    model.add(Conv2D(64, (3,3), activation='relu'))
    model.add(MaxPooling2D((2,2)))
    model.add(Conv2D(64, (3,3), activation='relu'))
    model.add(Flatten())
    model.add(Dense(64, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    
    model.summary()
    
    # 모델학습방식을 정의함
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    # 모델 학습시키기
    model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
    
    model.evaluate(test_images, test_labels)

    トランスファラーニング


    既存のデータラーニングを再利用できるネットワーク・カリキュラムのライブラリ

  • 使用方法
    パラメータを含む層
  • より前に学習したモデルから導入する.
  • 学習中に情報を凍結することにより、情報が破損することを防止する
  • .
  • 凍結層に新たな層(ユーザの必要とする方向、分類回帰等)
  • を追加する.
  • 新しい層だけを学ぶ

  • 長所
  • 学習データの使用が少ない
  • 学習速度がより速い
  • 汎用化良好

  • ResNet
    既存のシーケンスモデルとは異なり、接続をスキップしたモデルがあります.
    既存のモデルの階層が深ければ深いほど勾配の消失/爆発などの問題が発生しやすくなり、ResNetはより深い階層を作成しても学習が可能になります.


  • 実習
  • from keras.applications.resnet50 import ResNet50
    from tensorflow.python.keras.models import Sequential
    from tensorflow.python.keras.layers import Dense
    from tensorflow.keras import optimizers
    
    # 클래스의 개수 정의 : Cats & Dogs 
    NUM_CLASSES = 2
    
    # 입력 이미지의 차원 수 : RGB
    CHANNELS = 3
    # 학습된 네트워크 특징
    IMAGE_RESIZE = 224
    RESNET50_POOLING_AVERAGE = 'avg'
    DENSE_LAYER_ACTIVATION = 'softmax'
    OBJECTIVE_FUNCTION = 'categorical_crossentropy'
    
    # 출력 Metric
    LOSS_METRICS = ['accuracy']
    
    # EARLY_STOP_PATIENCE < NUM_EPOCHS
    NUM_EPOCHS = 10
    EARLY_STOP_PATIENCE = 3
    
    train-images / STEPS_PER_EPOCH_TRAINING
    STEPS_PER_EPOCH_TRAINING = 10
    STEPS_PER_EPOCH_VALIDATION = 10
    
    batching to fill epoch step input
    BATCH_SIZE_TRAINING = 100
    BATCH_SIZE_VALIDATION = 100
    
    # 테스트 배치의 개수
    BATCH_SIZE_TESTING = 1
    # 모델 제작
    model = Sequential()
    
    # weights = resnet_weights_path 학습해둔 모델이 있으면 이렇게 불러올 수 있음
    # include_top=False 기존의 FC를 버리겠다는 뜻
    model.add(ResNet50(include_top = False, pooling = RESNET50_POOLING_AVERAGE)) 
    model.add(Dense(NUM_CLASSES, activation = DENSE_LAYER_ACTIVATION))
    
    # 이미 학습된 영역은 학습하지 않겠다고 설정하는 옵션 
    model.layers[0].trainable = False
    
    # optimizer, compile
    sgd = optimizers.SGD(lr = 0.01, decay = 1e-6, momentum = 0.9, nesterov = True)
    model.compile(optimizer = sgd, loss = OBJECTIVE_FUNCTION, metrics = LOSS_METRICS)
    from keras.applications.resnet50 import preprocess_input
    from keras.preprocessing.image import ImageDataGenerator
    
    # 입력 이미지 사이즈 정의
    image_size = IMAGE_RESIZE
    # 입력 이미지, 데이터 증량(Augmentation)
    datagen = ImageDataGenerator(
        preprocessing_function=preprocess_input,
        featurewise_center=True, # 데이터셋의 평균을 0으로
        featurewise_std_normalization=True, #  데이터셋의 std로 나누기
        rotation_range=20,
        width_shift_range=0.2, #width 결정
        height_shift_range=0.2, #height 결정
        horizontal_flip=True)
    # compute quantities required for featurewise normalization
    # (std, mean, and principal components if ZCA whitening is applied)
    datagen.fit(train_images)
    
    #(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
    
    # 모델 학습 (전이 학습)
    model.fit(datagen.flow(train_images, train_labels, batch_size=32),
              steps_per_epoch=len(train_images) / 32, epochs=NUM_EPOCHS)

    Reference


    https://m.blog.naver.com/laonple/221259295035