산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Equipment >> 산업용 로봇

TensorFlow로 Variational Autoencoder를 구축하는 방법

오토인코더의 핵심 부분, 변형 자동 인코더가 이를 개선하는 방법, TensorFlow를 사용하여 변형 자동 인코더를 빌드하고 훈련하는 방법에 대해 알아보세요.

수년에 걸쳐 우리는 많은 분야와 산업에서 인공 지능(AI)의 힘을 활용하여 연구의 한계를 뛰어 넘는 것을 보았습니다. 데이터 압축 및 재구성도 예외는 아니며 인공 지능을 적용하여 보다 강력한 시스템을 구축할 수 있습니다.

이 기사에서는 데이터를 압축하고 자동 인코더로 압축된 데이터를 재구성하는 AI의 매우 인기 있는 사용 사례를 살펴보겠습니다.

자동 인코더 응용 프로그램

Autoencoder는 기계 학습 분야에서 많은 사람들의 관심을 받았으며, 이는 autoencoder의 개선과 여러 변형의 발명을 통해 분명해졌습니다. 그들은 신경 기계 번역, 약물 발견, 이미지 노이즈 제거 및 기타 여러 분야에서 (최신은 아닐지라도) 유망한 결과를 산출했습니다.

오토인코더의 일부

대부분의 신경망과 마찬가지로 자동 인코더는 기울기를 뒤로 전파하여 가중치 집합을 최적화하는 방식으로 학습하지만 자동 인코더 아키텍처와 대부분의 신경망 아키텍처 간의 가장 두드러진 차이점은 병목 현상입니다. 이 병목 현상은 데이터를 더 낮은 차원의 표현으로 압축하는 수단입니다. 자동 인코더의 다른 두 가지 중요한 부분은 인코더와 디코더입니다.

이 세 가지 구성 요소를 함께 결합하면 "바닐라" 자동 인코더가 형성되지만 더 정교한 구성 요소에는 몇 가지 추가 구성 요소가 있을 수 있습니다.

이러한 구성 요소를 개별적으로 살펴보겠습니다.

인코더

이것은 데이터 압축 및 재구성의 첫 번째 단계이며 실제로 데이터 압축 단계를 처리합니다. 인코더는 데이터 특징(예:이미지 압축의 경우 픽셀)을 받아들이고 데이터 특징의 크기보다 작은 크기의 잠재 벡터를 출력하는 피드포워드 신경망입니다.

James Loy가 제공한 이미지

데이터의 재구성을 견고하게 하기 위해 인코더는 입력 데이터 표현의 가장 중요한 특징을 작은 크기의 잠재 벡터로 압축하도록 훈련 중에 가중치를 최적화합니다. 이렇게 하면 디코더가 입력 데이터에 대한 충분한 정보를 확보하여 손실을 최소화하면서 데이터를 재구성할 수 있습니다.

잠재 벡터(병목 현상)

자동 인코더의 병목 현상 또는 잠재 벡터 구성 요소는 가장 중요한 부분이며 크기를 선택해야 할 때 더욱 중요해집니다.

인코더의 출력은 잠재 벡터를 제공하며 입력 데이터의 가장 중요한 특징 표현을 보유해야 합니다. 또한 디코더 부분에 대한 입력 역할을 하며 재구성을 위해 디코더에 유용한 표현을 전파합니다.

잠재 벡터에 대해 더 작은 크기를 선택하면 입력 데이터에 대한 더 적은 정보로 입력 데이터 기능을 표시할 수 있습니다. 훨씬 더 큰 잠재 벡터 크기를 선택하면 자동 인코더를 사용한 압축에 대한 전체 아이디어가 경시되고 계산 비용도 증가합니다.

디코더

이 단계에서는 데이터 압축 및 재구성 프로세스를 마칩니다. 인코더와 마찬가지로 이 구성 요소도 피드포워드 신경망이지만 인코더와 구조적으로 약간 다릅니다. 이 차이는 디코더가 디코더의 출력보다 작은 크기의 잠재 벡터를 입력으로 받는다는 사실에서 비롯됩니다.

디코더의 기능은 입력에 매우 가까운 잠재 벡터에서 출력을 생성하는 것입니다.

이미지 사용:Chiman Kwan 제공

오토인코더 교육

일반적으로 오토인코더를 훈련할 때 이러한 구성 요소를 독립적으로 구축하는 대신 함께 구축합니다. 우리는 경사하강법 또는 ADAM 옵티마이저와 같은 최적화 알고리즘을 사용하여 종단 간 교육을 실시합니다.

손실 함수

논의할 가치가 있는 오토인코더 훈련 절차의 한 부분은 손실 함수입니다. 데이터 재구성은 생성 작업이며 올바른 클래스를 예측할 확률을 최대화하는 것이 목표인 다른 기계 학습 작업과 달리 입력에 가까운 출력을 생성하도록 네트워크를 구동합니다.

l1, l2, 평균 제곱 오차 및 기타 몇 가지와 같은 여러 손실 함수를 사용하여 이 목표를 달성할 수 있습니다. 이러한 손실 함수의 공통점은 입력과 출력 간의 차이(즉, 얼마나 멀리 또는 동일한지)를 측정하여 둘 중 하나를 적절한 선택으로 만든다는 것입니다.

오토인코더 네트워크

그동안 우리는 인코더와 디코더를 모두 설계하기 위해 다층 퍼셉트론을 사용해 왔지만 CNN(컨볼루션 신경망)과 같은 보다 전문화된 프레임워크를 사용하여 이미지 데이터 압축의 경우.

놀랍게도, 연구에 따르면 텍스트 데이터의 자동 인코더로 사용되는 순환 네트워크가 매우 잘 작동하지만 이 기사의 범위에서는 이에 대해 다루지 않을 것입니다. 다중 계층 퍼셉트론에서 사용되는 인코더-잠재 벡터-디코더의 개념은 여전히 ​​컨볼루션 자동 인코더에 적용됩니다. 유일한 차이점은 디코더와 인코더를 컨볼루션 레이어로 설계한다는 것입니다.

이러한 모든 자동 인코더 네트워크는 압축 작업에 매우 적합하지만 한 가지 문제가 있습니다.

우리가 논의한 네트워크는 창의성이 전혀 없습니다. 창의성이 0이라는 말은 그들이 보거나 훈련을 받은 결과만 생성할 수 있다는 것입니다.

아키텍처 디자인을 약간 조정하여 창의성을 어느 정도 유도할 수 있습니다. 결과는 변형 자동 인코더로 알려져 있습니다.

Dawid Kopczyk 제공 이미지 사용

변형 자동 인코더

Variational autoencoder는 두 가지 주요 설계 변경 사항을 도입합니다.

<울>
  • 입력을 잠재 인코딩으로 변환하는 대신 두 개의 매개변수 벡터인 평균과 분산을 출력합니다.
  • KL 발산 손실이라는 추가 손실 항이 초기 손실 함수에 추가됩니다.
  • Variational autoencoder 뒤에 있는 아이디어는 디코더가 인코더에 의해 생성된 평균 벡터와 분산 벡터에 의해 매개변수화된 분포에서 샘플링된 잠재 벡터를 사용하여 데이터를 재구성하기를 원한다는 것입니다.

    분포에서 샘플링 기능은 디코더에 생성할 제어된 공간을 부여합니다. Variational Autoencoder를 훈련시킨 후 입력 데이터로 순방향 전달을 수행할 때마다 인코더는 잠재 벡터를 샘플링할 분포를 결정하는 평균 및 분산 벡터를 생성합니다.

    평균 벡터는 입력 데이터의 인코딩이 중심이 되어야 하는 위치를 결정하고 분산은 실제 출력을 생성하기 위해 인코딩을 선택하려는 방사형 공간 또는 원을 결정합니다. 즉, 동일한 입력 데이터를 사용하는 모든 정방향 패스에서 Variational Autoencoder는 평균 벡터를 중심으로 분산 공간 내에서 다양한 출력 변형을 생성할 수 있습니다.

    비교를 위해 표준 자동 인코더를 볼 때 네트워크가 훈련되지 않은 출력을 생성하려고 하면 인코더가 생성하는 잠재 벡터 공간의 불연속성으로 인해 비현실적인 출력이 생성됩니다.

    이미지 사용:Irhum Shafkat 제공

    이제 Variational Autoencoder를 직관적으로 이해했으므로 TensorFlow에서 빌드하는 방법을 살펴보겠습니다.

    변형 자동 인코더용 TensorFlow 코드

    데이터 세트를 준비하여 예제를 시작하겠습니다. 편의상 MNIST 데이터세트를 사용하겠습니다.

    (train_images, _), (test_images, _) =tf.keras.datasets.mnist.load_data()

    train_images =train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')

    test_images =test_images.reshape(test_images.shape[0], 28, 28, 1).astype('float32')

    # 이미지를 [0., 1.] 범위로 정규화

    train_images /=255.

    테스트_이미지 /=255.

    # 이진화

    기차 이미지[기차 이미지>=.5] =1.

    기차 이미지[기차 이미지 <.5] =0.

    test_images[test_images>=.5] =1.

    테스트_이미지[테스트_이미지 <.5] =0.

    TRAIN_BUF =60000

    배치_크기 =100

    TEST_BUF =10000

    train_dataset =tf.data.Dataset.from_tensor_slices(train_images).shuffle(TRAIN_BUF).batch(BATCH_SIZE)

    test_dataset =tf.data.Dataset.from_tensor_slices(test_images).shuffle(TEST_BUF).batch(BATCH_SIZE)

    데이터 세트를 얻고 작업을 위해 준비합니다.

    클래스 CVAE(tf.keras.Model):

    def __init__(self, latent_dim):

    super(CVAE, self).__init__()

    self.latent_dim =latent_dim

    <코드> self.inference_net =tf.keras.Sequential(

    <코드> [

    <코드> tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),

    <코드> tf.keras.layers.Conv2D(

    필터=32, kernel_size=3, strides=(2, 2), 활성화='relu'),

    <코드> tf.keras.layers.Conv2D(

    필터=64, kernel_size=3, strides=(2, 2), 활성화='relu'),

    tf.keras.layers.Flatten(),

    # 활성화되지 않음

    tf.keras.layers.Dense(latent_dim + latent_dim),

    <코드> ]

    <코드> )

    <코드> self.generative_net =tf.keras.Sequential(

    <코드> [

    <코드> tf.keras.layers.InputLayer(input_shape=(latent_dim,)),

    <코드> tf.keras.layers.Dense(단위=7*7*32, 활성화=tf.nn.relu),

    <코드> tf.keras.layers.Reshape(target_shape=(7, 7, 32)),

    tf.keras.layers.Conv2DTranspose(

    필터=64,

    kernel_size=3,

    strides=(2, 2),

    패딩="SAME",

    활성화='relu'),

    tf.keras.layers.Conv2DTranspose(

    필터=32,

    kernel_size=3,

    strides=(2, 2),

    패딩="SAME",

    활성화='relu'),

    # 활성화되지 않음

    tf.keras.layers.Conv2DTranspose(

    필터=1, kernel_size=3, strides=(1, 1), padding="SAME"),

    <코드> ]

    <코드> )

    @tf.function

    def 샘플(self, eps=None):

    eps가 None인 경우:

    <코드> eps =tf.random.normal(shape=(100, self.latent_dim))

    return self.decode(eps, apply_sigmoid=True)

    def encode(self, x):

    평균, logvar =tf.split(self.inference_net(x), num_or_size_splits=2, axis=1)

    반환 평균, logvar

    def reparameterize(self, mean, logvar):

    <코드> eps =tf.random.normal(shape=mean.shape)

    return eps * tf.exp(logvar * .5) + 평균

    def 디코드(self, z, apply_sigmoid=False):

    logits =self.generative_net(z)

    apply_sigmoid인 경우:

    probs =tf.sigmoid(logits)

    반환 확률

    반환 로그

    두 개의 코드 조각은 데이터 세트를 준비하고 변형 자동 인코더 모델을 빌드합니다. 모델 코드 스니펫에는 인코딩, 샘플링 및 디코딩을 수행하는 몇 가지 도우미 함수가 있습니다.

    그라디언트 계산을 위한 재매개변수화

    우리가 논의하지 않았지만 우리의 Variational Autoencoder 네트워크에서 매우 중요한 문제를 해결하는 재매개변수화 기능이 있습니다. 디코딩 단계에서 인코더에 의해 생성된 평균 및 분산 벡터에 의해 제어되는 분포에서 잠재 벡터 인코딩을 샘플링한다는 것을 상기하십시오. 이것은 네트워크를 통해 데이터를 전달하는 데 문제가 되지 않지만 샘플링 작업은 미분할 수 없기 때문에 디코더에서 인코더로 기울기를 역전파할 때는 큰 문제를 일으킵니다.

    간단히 말해서 샘플링 작업에서 기울기를 계산할 수 없습니다.

    이 문제에 대한 좋은 해결 방법은 다시 매개변수화 트릭을 적용하는 것입니다. 이것은 먼저 평균 0과 분산 1의 표준 가우스 분포를 생성한 다음 인코더에 의해 생성된 평균과 분산으로 이 분포에 대해 미분 가능한 덧셈 및 곱셈 연산을 수행하여 작동합니다.

    코드에서 분산을 로그 공간으로 변환하는 것에 주목하십시오. 이는 수치적 안정성을 보장하기 위한 것입니다. 추가적인 손실 항인 Kullback-Leibler divergence loss가 도입되어 우리가 생성하는 분포가 가능한 평균이 0이고 분산이 1인 표준 가우스 분포에 가깝습니다.

    분포의 평균을 0으로 설정하면 분포 간의 불연속성을 방지하기 위해 생성된 분포가 서로 매우 가깝습니다. 분산이 1에 가까우면 인코딩을 생성할 더 적당한(매우 크지도 않고 작지도 않은) 공간이 있음을 의미합니다.

    Jeremy Jordan 제공 이미지 사용

    재매개변수화 트릭을 수행한 후 분산 벡터에 표준 가우스 분포를 곱하고 그 결과를 평균 벡터에 더한 분포는 평균 및 분산 벡터에 의해 즉시 제어되는 분포와 매우 유사합니다.

    변형 자동 인코더를 구축하는 간단한 단계

    변형 자동 인코더를 구축하는 단계를 요약하여 이 자습서를 마무리하겠습니다.

    <올>
  • 엔코더 및 디코더 네트워크를 구축합니다.
  • 역전파를 허용하기 위해 인코더와 디코더 사이에 재매개변수화 트릭을 적용합니다.
  • 두 네트워크를 모두 교육합니다.
  • 위에 사용된 전체 코드는 공식 TensorFlow 웹사이트에서 찾을 수 있습니다.

    Chiman Kwan이 수정한 주요 이미지


    산업용 로봇

    1. 3D 프린터가 금속 물체를 만드는 방법
    2. 자율 로봇으로 폐기물을 줄이는 방법
    3. 클라우드 기술을 보호하는 방법은 무엇입니까?
    4. 데이터로 무엇을 해야 합니까?!
    5. IoT가 HVAC 빅 데이터에 도움이 되는 방법:2부
    6. Tech Data 및 IBM Part 2로 IOT를 실현하는 방법
    7. Tech Data 및 IBM Part 1을 통해 IoT를 현실로 만드는 방법
    8. 공급망 기업이 AI로 로드맵을 구축하는 방법
    9. 데이터 마이닝, AI:산업 브랜드가 전자 상거래를 따라갈 수 있는 방법
    10. 공구 수명이란 무엇입니까? 머신 데이터로 툴링을 최적화하는 방법