Linear, Convolution

12001 ワード

学習目標


  • レイヤーコンセプト

  • レイヤーの動作

  • レイヤーデザイン

  • Tensorflowの定義
  • データ型


  • (m,n)マトリックス->データフレーム

  • (C,W,H) -> Channel , Width, Height

  • チャネルちゃんねる:イメージデータめーしょんでーた
  • Layer


    定義
  • :1つのオブジェクトは複数の論理オブジェクトから構成されます.
  • Linear Layer


  • 定義:線形変換と同じ機能を持ちます.

  • 特長
    1.線形変換によりデータを特定の次元に変換

  • データが豊富になったり密集したりします.
    2.(a,b)と(a*b)は同じ行列である.
    3.各行列はWeight
    4.Weightのすべての要素はParameterです
    5.パラメータ依存時にオーバーフィットが発生しました.
    6.適当なWeight<--トレーニングを探せ!!
    7.地域性そのものが非常に重要な情報である.
    ->削除する場合は、I/O間の関係加重値を検索する必要があります.

  • フォント:(入力された次元、出力された次元)

  • オフセット(Offset)
    定義
  • :線形変換の値にオフセットパラメータを追加します.

  • 目的:データに基づいてWeight宣言を行う!
  • コード第1弾
  • ## 데이터 집약시키는 코드
    
    import tensorflow as tf
    
    batch_size = 64
    boxes = tf.zeros((batch_size, 4, 2))     # Tensorflow는 Batch를 기반으로 동작하기에,
                                             # 우리는 사각형 2개 세트를 batch_size개만큼
                                             # 만든 후 처리를 하게 됩니다.
    print("1단계 연산 준비:", boxes.shape)
    
    first_linear = tf.keras.layers.Dense(units=1, use_bias=False) 
    # units은 출력 차원 수를 의미합니다.
    
    
    first_out = first_linear(boxes)
    first_out = tf.squeeze(first_out, axis=-1) # (4, 1)을 (4,)로 변환해줍니다.
                                               # (불필요한 차원 축소)
    
    print("1단계 연산 결과:", first_out.shape)
    print("1단계 Linear Layer의 Weight 형태:", first_linear.weights[0].shape)
    
    print("\n2단계 연산 준비:", first_out.shape)
    
    second_linear = tf.keras.layers.Dense(units=1, use_bias=False)
    second_out = second_linear(first_out)
    second_out = tf.squeeze(second_out, axis=-1)
    
    print("2단계 연산 결과:", second_out.shape)
    print("2단계 Linear Layer의 Weight 형태:", second_linear.weights[0].shape)
  • コード実施第2弾
  • ## 데이터 풍부
    
    import tensorflow as tf
    
    batch_size = 64
    boxes = tf.zeros((batch_size, 4, 2))
    
    print("1단계 연산 준비:", boxes.shape)
    
    first_linear = tf.keras.layers.Dense(units=3, use_bias=False)
    first_out = first_linear(boxes)
    
    print("1단계 연산 결과:", first_out.shape)
    print("1단계 Linear Layer의 Weight 형태:", first_linear.weights[0].shape)
    
    print("\n2단계 연산 준비:", first_out.shape)
    
    second_linear = tf.keras.layers.Dense(units=1, use_bias=False)
    second_out = second_linear(first_out)
    second_out = tf.squeeze(second_out, axis=-1)
    
    print("2단계 연산 결과:", second_out.shape)
    print("2단계 Linear Layer의 Weight 형태:", second_linear.weights[0].shape)
    
    print("\n3단계 연산 준비:", second_out.shape)
    
    third_linear = tf.keras.layers.Dense(units=1, use_bias=False)
    third_out = third_linear(second_out)
    third_out = tf.squeeze(third_out, axis=-1)
    
    print("3단계 연산 결과:", third_out.shape)
    print("3단계 Linear Layer의 Weight 형태:", third_linear.weights[0].shape)
    
    total_params = \
    first_linear.count_params() + \
    second_linear.count_params() + \
    third_linear.count_params()
    
    print("총 Parameters:", total_params)

    Convolution Layer

  • 進化とは何ですか?

    :ある関数を別の関数に乗算し、それを積分して新しい関数を求めます-->フィルタと画像の重なりでConv演算を行うと,新しい画像変形が得られる.

  • 効果
  • image detection
  • ブルーレイ処理
  • Simple box
  • Gaussian

  • Edge detection


  • The Sobel Edge Operator
  • The laplacian operator
  • The Laplacian of Gaussian

  • Conv演算
    :入力形式を変更します.

  • 歩調

  • なぜpaddingを使うのか

  • ステップ長が大きすぎたり、フィルタが大きすぎたりして計算が正しくできないことを防止します.

  • 通常、filterを使用すると入力画像が小さくなるだけで、zero paddingを使用すると画像のサイズを維持することができます.

  • Conv後にOutputイメージサイズを保持

  • これはエッジの画素情報を利用するためである.

  • 構成:Weight、[フィルタ数フィルタの水平フィルタの垂直]から構成されています.

  • 特長
  • 入力情報密集型(多層ネスト)
  • 最終Linearはより小さく、
  • を最適化できます.
  • 領域情報は完全であり、隣接画素間のパターンを抽出するだけで不要な演算を排除し、正確な計算を行うことができる.

  • に質問
  • フィルタは、ターゲット検出器
  • を小さい収容することができる.
  • ステップサイズのため、パラメータは減少する可能性がありますが、ターゲットフィルタの境界に引っかかり、認識できません.
  • 極端にフィルターサイズを画像と同じにするとLinear Layerになります.また、これにより計算量が増加し、治癒率が低下する.

  • コードで実現

  • 
    import tensorflow as tf
    
    batch_size = 64
    pic = tf.zeros((batch_size, 1920, 1080, 3))
    
    print("입력 이미지 데이터:", pic.shape)
    conv_layer = tf.keras.layers.Conv2D(filters=16,
                                        kernel_size=(5, 5),
                                        strides=5,
                                        use_bias=False)
    conv_out = conv_layer(pic)
    
    print("\nConvolution 결과:", conv_out.shape)
    print("Convolution Layer의 Parameter 수:", conv_layer.count_params())
    
    flatten_out = tf.keras.layers.Flatten()(conv_out)
    print("\n1차원으로 펼친 데이터:", flatten_out.shape)
    
    linear_layer = tf.keras.layers.Dense(units=1, use_bias=False)
    linear_out = linear_layer(flatten_out)
    
    print("\nLinear 결과:", linear_out.shape)
    print("Linear Layer의 Parameter 수:", linear_layer.count_params())

    Pooling Layer


    Receptive Field


  • プロセス:NNが十分な情報を取得するために上書きする入力データの受信領域は、この部分が十分に大きくなければならず、入力データにはオブジェクトの属性
  • が含まれる必要がある.

    MAX POOLING



  • 正義受信領域を効果的に拡大し、情報密集度を最大限に向上させ、フィルタサイズを0とする.

  • フィーチャー:最大の代表領域を選択し、残りの領域を無視します.
  • なぜMAXPOOLINGは顧客満足度Xを下げるのか

  • 平行移動不変性効果
  • :切替効果が発生しても、同じ特徴を安定的に捉え、継ぎ手と安定した特徴抽出効果を防止
  • 非線形関数を有する抽出効果
  • :サブレイヤの計算結果は無視されますが、親レイヤを抽出することでパフォーマンスが向上します.
  • Receptive Field最大化.
  • :積層しすぎると、継ぎ手、年間増分、傾斜損失などの問題が発生しますが、これらの問題を解決する必要があります.

    Deconvolution Layer


    Auto Encoder


  • 定義:Convolution結果を逆再生して元に戻す

  • 作成順序
  • importパッケージとload MNIST Data set
  • ## 이미지 복원을 할 것이기 때문에 y_train, y_test를 사용하지 않고
    ## x_train의 라벨이 x_train자신이 된다.
    
    import numpy as np
    from tensorflow.python.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
    from tensorflow.python.keras.models import Model
    from tensorflow.python.keras.datasets import mnist
    import json
    import matplotlib.pyplot as plt #for plotting
    
    # MNIST 데이터 로딩
    (x_train, _), (x_test, _) = mnist.load_data()    # y_train, y_test는 사용하지 않습니다.
    
    x_train = np.expand_dims(x_train, axis=3)
    x_test = np.expand_dims(x_test, axis=3)
    
    x_train = x_train.astype('float32') / 255.
    x_test = x_test.astype('float32') / 255.
  • オートエンコーダモデル構成
  • # 모델 구성
    
    # AutoEncoder 모델 구성 - Input 부분
    input_shape = x_train.shape[1:]
    input_img = Input(shape=input_shape)
    
    # AutoEncoder 모델 구성 - Encoder 부분
    encode_conv_layer_1 = Conv2D(16, (3, 3), activation='relu', padding='same')
    encode_pool_layer_1 = MaxPooling2D((2, 2), padding='same')
    encode_conv_layer_2 = Conv2D(8, (3, 3), activation='relu', padding='same')
    encode_pool_layer_2 = MaxPooling2D((2, 2), padding='same')
    encode_conv_layer_3 = Conv2D(4, (3, 3), activation='relu', padding='same')
    encode_pool_layer_3 = MaxPooling2D((2, 2), padding='same')
    
    encoded = encode_conv_layer_1(input_img)
    encoded = encode_pool_layer_1(encoded)
    encoded = encode_conv_layer_2(encoded)
    encoded = encode_pool_layer_2(encoded)
    encoded = encode_conv_layer_3(encoded)
    encoded = encode_pool_layer_3(encoded)
    
    # AutoEncoder 모델 구성 - Decoder 부분
    # Conv2D: shape를 변화시키지 않는다.
    ## MaxPooling2D만 output Shape변화
    decode_conv_layer_1 = Conv2D(4, (3, 3), activation='relu', padding='same')
    decode_upsample_layer_1 = UpSampling2D((2, 2))
    decode_conv_layer_2 = Conv2D(8, (3, 3), activation='relu', padding='same')
    decode_upsample_layer_2 = UpSampling2D((2, 2))
    decode_conv_layer_3 = Conv2D(16, (3, 3), activation='relu')
    decode_upsample_layer_3 = UpSampling2D((2, 2))
    decode_conv_layer_4 = Conv2D(1, (3, 3), activation='sigmoid', padding='same')
    
    # upsampling2d를 거쳐서 최종 출력 28 * 28 사이즈가 나온다
    #upsampling2d를 거친다
    decoded = decode_conv_layer_1(encoded)   # Decoder는 Encoder의 출력을 입력으로 받습니다.
    decoded = decode_upsample_layer_1(decoded)
    decoded = decode_conv_layer_2(decoded)
    decoded = decode_upsample_layer_2(decoded)
    decoded = decode_conv_layer_3(decoded)
    decoded = decode_upsample_layer_3(decoded)
    decoded = decode_conv_layer_4(decoded)
    
    # AutoEncoder 모델 정의
    autoencoder = Model(input_img, decoded)
    autoencoder.summary()
  • モデルトレーニング
  • ##  이미지 생성
    
    x_test_10 = x_test[:10]       # 테스트 데이터셋에서 10개만 골라서
    x_test_hat = autoencoder.predict(x_test_10)    # AutoEncoder 모델의 이미지 복원생성
    x_test_imgs = x_test_10.reshape(-1, 28, 28)
    x_test_hat_imgs = x_test_hat.reshape(-1, 28, 28)
    
    plt.figure(figsize=(12,5))  # 이미지 사이즈 지정
    for i in range(10):  
        # 원본이미지 출력
        plt.subplot(2, 10, i+1)
        plt.imshow(x_test_imgs[i])
        # 생성된 이미지 출력
        plt.subplot(2, 10, i+11)
        plt.imshow(x_test_hat_imgs[i])

    Decoder Layers for Reconstruction


    :反転演算による画像復元

    アップサンプリングレイヤ

  • Nearest Neighbor:リカバリが必要な値を近い値にコピーします.
  • Bed of Nails:リカバリが必要な値を0に処理します.
  • Max Unpooling:Max Poolingの復元時に破棄された値.
  • Transposed Convolution

  • コード実装
  • from tensorflow.python.keras.layers import Conv2DTranspose
    
    # Conv2DTranspose를 활용한  AutoEncoder 모델
    # AutoEncoder 모델 구성 - Input 부분
    input_shape = x_train.shape[1:]
    input_img = Input(shape=input_shape)
    
    # AutoEncoder 모델 구성 - Encoder 부분
    encode_conv_layer_1 = Conv2D(16, (3, 3), activation='relu')
    encode_pool_layer_1 = MaxPooling2D((2, 2))
    encode_conv_layer_2 = Conv2D(8, (3, 3), activation='relu')
    encode_pool_layer_2 = MaxPooling2D((2, 2))
    encode_conv_layer_3 = Conv2D(4, (3, 3), activation='relu')
    
    encoded = encode_conv_layer_1(input_img)
    encoded = encode_pool_layer_1(encoded)
    encoded = encode_conv_layer_2(encoded)
    encoded = encode_pool_layer_2(encoded)
    encoded = encode_conv_layer_3(encoded)
    
    # AutoEncoder 모델 구성 - Decoder 부분  - 
    decode_conv_layer_1 = Conv2DTranspose(4, (3, 3), activation='relu', padding='same')
    decode_upsample_layer_1 = UpSampling2D((2, 2))
    decode_conv_layer_2 = Conv2DTranspose(8, (3, 3), activation='relu', padding='same')
    decode_upsample_layer_2 = UpSampling2D((2, 2))
    decode_conv_layer_3 = Conv2DTranspose(16, (3, 3), activation='relu')
    decode_upsample_layer_3 = UpSampling2D((2, 2))
    decode_conv_layer_4 = Conv2DTranspose(1, (3, 3), activation='sigmoid', padding='same')
    
    decoded = decode_conv_layer_1(encoded)   # Decoder는 Encoder의 출력을 입력으로 받습니다.
    decoded = decode_upsample_layer_1(decoded)
    decoded = decode_conv_layer_2(decoded)
    decoded = decode_upsample_layer_2(decoded)
    decoded = decode_conv_layer_3(decoded)
    decoded = decode_upsample_layer_3(decoded)
    decoded = decode_conv_layer_4(decoded)
    
    # AutoEncoder 모델 정의
    autoencoder = Model(input_img, decoded)
    autoencoder.summary()