VAE(Variational Autoencoder)는 신경망을 기반으로 하는 생성 모델입니다. 그 목표는 고차원 데이터의 저차원 잠재 변수 표현을 학습하고 이러한 잠재 변수를 데이터 재구성 및 생성에 사용하는 것입니다. 기존 오토인코더와 비교하여 VAE는 잠재 공간의 분포를 학습하여 보다 현실적이고 다양한 샘플을 생성할 수 있습니다. VAE의 구현 방법은 아래에서 자세히 소개된다.
1. VAE의 기본 원리
VAE의 기본 아이디어는 고차원 데이터를 저차원 잠재 공간에 매핑하여 데이터의 차원 축소 및 재구성을 달성하는 것입니다. 인코더와 디코더의 두 부분으로 구성됩니다. 인코더는 입력 데이터 x를 잠재 공간의 평균 μ 및 분산 σ^2에 매핑합니다. 이러한 방식으로 VAE는 잠재 공간의 데이터를 샘플링하고 샘플링된 결과를 디코더를 통해 원본 데이터로 재구성할 수 있습니다. 이 인코더-디코더 구조를 통해 VAE는 잠재 공간에서 연속성이 좋은 새로운 샘플을 생성하여 잠재 공간에서 유사한 샘플을 더 가깝게 만들 수 있습니다. 따라서 VAE는 차원 축소에만 사용될 수 없으며
\begin{aligned} \mu &=f_{\mu}(x)\ \sigma^2 &=f_{\sigma}(x) \end{aligned}
여기에서 f_{mu} 및 f_{sigma}는 모든 신경망 모델이 될 수 있습니다. 일반적으로 우리는 인코더를 구현하기 위해 MLP(Multilayer Perceptron)를 사용합니다.
디코더는 잠재 변수 z를 원래 데이터 공간으로 다시 매핑합니다. 즉,
x'=g(z)
여기서 g는 모든 신경망 모델일 수도 있습니다. 마찬가지로 우리는 일반적으로 MLP를 사용하여 디코더를 구현합니다.
VAE에서 잠재 변수 $z$는 사전 분포(일반적으로 가우스 분포)에서 샘플링됩니다. 즉:
z\sim\mathcal{N}(0,I)
이러한 방식으로 재구성 오류를 최소화할 수 있으며 잠재 변수 KL 발산이 사용됩니다. 차원 축소 및 데이터 생성을 달성하기 위해 VAE를 훈련합니다. 구체적으로 VAE의 손실 함수는 다음과 같이 표현될 수 있습니다.
\mathcal{L}=\mathbb{E}_{z\sim q(z|x)}[\log p(x|z)]-\beta\mathrm{KL}[q(z|x)||p(z)]
여기서, q(z|x)는 사후 분포, 즉 입력 x가 주어졌을 때 잠재 변수 z의 조건부 분포입니다. z)는 생성 분포, 즉 잠재 변수 $z$가 주어졌을 때 해당 데이터 분포이고, p(z)는 사전 분포, 즉 잠재 변수 z의 한계 분포가 사용된 하이퍼파라미터입니다. 재구성 오류와 KL 발산의 균형을 유지합니다.
위의 손실 함수를 최소화함으로써 입력 데이터 x를 잠재 공간의 분포 q(z|x)에 매핑할 수 있는 변환 함수 f(x)를 학습하고 다음에서 잠재 변수를 샘플링할 수 있습니다. z로 하여 차원 축소 및 데이터 생성을 달성합니다.
2. VAE 구현 단계
아래에서는 인코더, 디코더 및 손실 함수의 정의를 포함하여 기본 VAE 모델을 구현하는 방법을 소개합니다. MNIST 필기 숫자 데이터 세트를 예로 들겠습니다. 이 데이터 세트에는 60,000개의 훈련 샘플과 10,000개의 테스트 샘플이 포함되어 있으며 각 샘플은 28x28 회색조 이미지입니다.
2.1 데이터 전처리
먼저 MNIST 데이터 세트를 전처리하고 각 샘플을 784차원 벡터로 변환한 후 [0,1] 범위로 정규화해야 합니다. 코드는 다음과 같습니다.
# python import torch import torchvision.transforms as transforms from torchvision.datasets import MNIST # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), # 将图像转换成Tensor格式 transforms.Normalize(mean=(0.
2.2 모델 구조 정의
다음으로 잠재 변수의 인코더, 디코더 및 샘플링 기능을 포함하여 VAE 모델의 구조를 정의해야 합니다. 이 예에서는 2계층 MLP를 인코더와 디코더로 사용하며, 각 계층의 숨겨진 유닛 수는 각각 256개와 128개입니다. 잠재변수의 차원은 20이다. 코드는 다음과 같습니다.
import torch.nn as nn class VAE(nn.Module): def __init__(self, input_dim=784, hidden_dim=256, latent_dim=20): super(VAE, self).__init__() # 定义编码器的结构 self.encoder = nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim//2), nn.ReLU(), nn.Linear(hidden_dim//2, latent_dim*2) # 输出均值和方差 ) # 定义解码器的结构 self.decoder = nn.Sequential( nn.Linear(latent_dim, hidden_dim//2), nn.ReLU(), nn.Linear(hidden_dim//2, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, input_dim), nn.Sigmoid() # 输出范围在[0, 1]之间的概率 ) # 潜在变量的采样函数 def sample_z(self, mu, logvar): std = torch.exp(0.5*logvar) eps = torch.randn_like(std) return mu + eps*std # 前向传播函数 def forward(self, x): # 编码器 h = self.encoder(x) mu, logvar = h[:, :latent_dim], h[:, latent_dim:] z = self.sample_z(mu, logvar) # 解码器 x_hat = self.decoder(z) return x_hat, mu, logvar
위 코드에서는 인코더와 디코더로 2계층 MLP를 사용합니다. 인코더는 입력 데이터를 잠재 공간의 평균 및 분산에 매핑합니다. 여기서 평균의 차원은 20이고 분산의 차원도 20이므로 잠재 변수의 차원은 20이 됩니다. 디코더는 잠재 변수를 원래 데이터 공간으로 다시 매핑합니다. 여기서 마지막 레이어는 Sigmoid 함수를 사용하여 출력 범위를 [0, 1]로 제한합니다.
VAE 모델을 구현할 때 손실 함수도 정의해야 합니다. 이 예에서는 재구성 오류와 KL 발산을 사용하여 손실 함수를 정의합니다. 여기서 재구성 오류는 교차 엔트로피 손실 함수를 사용하고 KL 발산은 표준 정규 분포를 사전 분포로 사용합니다. 코드는 다음과 같습니다.
# 定义损失函数 def vae_loss(x_hat, x, mu, logvar, beta=1): # 重构误差 recon_loss = nn.functional.binary_cross_entropy(x_hat, x, reduction='sum') # KL散度 kl_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) return recon_loss + beta*kl_loss
위 코드에서는 교차 엔트로피 손실 함수를 사용하여 재구성 오류를 계산하고 KL 발산을 사용하여 잠재 변수 분포와 사전 분포의 차이를 계산합니다. 그 중 베타는 재구성 오류와 KL 발산의 균형을 맞추는 데 사용되는 하이퍼파라미터입니다.
2.3 훈련 모델
마지막으로 훈련 기능을 정의하고 MNIST 데이터 세트에서 VAE 모델을 훈련해야 합니다. 훈련 과정에서 먼저 모델의 손실 함수를 계산한 다음 역전파 알고리즘을 사용하여 모델 매개변수를 업데이트해야 합니다. 코드는 다음과 같습니다:
# python # 定义训练函数 def train(model, dataloader, optimizer, device, beta): model.train() train_loss = 0 for x, _ in dataloader: x = x.view(-1, input_dim).to(device) optimizer.zero_grad() x_hat, mu, logvar = model(x) loss = vae_loss(x_hat, x, mu, logvar, beta) loss.backward() train_loss += loss.item() optimizer.step() return train_loss / len(dataloader.dataset)
이제 위의 훈련 함수를 사용하여 MNIST 데이터 세트에서 VAE 모델을 훈련할 수 있습니다. 코드는 다음과 같습니다.
# 定义模型和优化器 model = VAE().to(device) optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) # 训练模型 num_epochs = 50 for epoch in range(num_epochs): train_loss = train(model, trainloader, optimizer, device, beta=1) print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}') # 测试模型 model.eval() with torch.no_grad(): test_loss = 0 for x, _ in testloader: x = x.view(-1, input_dim).to(device) x_hat, mu, logvar = model(x) test_loss += vae_loss(x_hat, x, mu, logvar, beta=1).item() test_loss /= len(testloader.dataset) print(f'Test Loss: {test_loss:.4f}')
교육 과정에서 우리는 Adam 최적화 프로그램과 베타=1의 하이퍼 매개변수를 사용하여 모델 매개변수를 업데이트합니다. 훈련이 완료된 후 테스트 세트를 사용하여 모델의 손실 함수를 계산합니다. 이 예에서는 재구성 오류와 KL 발산을 사용하여 손실 함수를 계산하므로 테스트 손실이 작을수록 모델이 학습한 잠재적 표현이 더 좋고 생성된 샘플이 더 현실적입니다.
2.4 샘플 생성
最后,我们可以使用VAE模型生成新的手写数字样本。生成样本的过程非常简单,只需要在潜在空间中随机采样,然后将采样结果输入到解码器中生成新的样本。代码如下:
# 生成新样本 n_samples = 10 with torch.no_grad(): # 在潜在空间中随机采样 z = torch.randn(n_samples, latent_dim).to(device) # 解码生成样本 samples = model.decode(z).cpu() # 将样本重新变成图像的形状 samples = samples.view(n_samples, 1, 28, 28) # 可视化生成的样本 fig, axes = plt.subplots(1, n_samples, figsize=(20, 2)) for i, ax in enumerate(axes): ax.imshow(samples[i][0], cmap='gray') ax.axis('off') plt.show()
在上述代码中,我们在潜在空间中随机采样10个点,然后将这些点输入到解码器中生成新的样本。最后,我们将生成的样本可视化展示出来,可以看到,生成的样本与MNIST数据集中的数字非常相似。
综上,我们介绍了VAE模型的原理、实现和应用,可以看到,VAE模型是一种非常强大的生成模型,可以学习到高维数据的潜在表示,并用潜在表示生成新的样本。
위 내용은 Variational Autoencoder: 이론 및 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

소개 매일 몇 주 만에 작물의 진행 상황을 관찰하는 농부가 있다고 가정합니다. 그는 성장률을보고 몇 주 안에 식물이 얼마나 키가 커질 수 있는지에 대해 숙고하기 시작합니다. Th

Soft AI-대략적인 추론, 패턴 인식 및 유연한 의사 결정을 사용하여 구체적이고 좁은 작업을 수행하도록 설계된 AI 시스템으로 정의 된 것은 모호성을 수용하여 인간과 같은 사고를 모방하려고합니다. 그러나 이것이 바이러스의 의미는 무엇입니까?

클라우드 컴퓨팅이 클라우드 네이티브 보안 도구로의 전환이 필요했기 때문에 AI는 AI의 고유 한 요구를 위해 특별히 설계된 새로운 유형의 보안 솔루션을 요구합니다. 클라우드 컴퓨팅 및 보안 수업의 상승이 배웠습니다 th

기업가와 AI 및 생성 AI를 사용하여 비즈니스를 개선합니다. 동시에, 모든 기술과 마찬가지로 생성 AI를 기억하는 것이 중요합니다. 앰프는 앰프입니다. 엄격한 2024 연구 o

임베딩 모델의 힘 잠금 해제 : Andrew Ng의 새로운 코스에 대한 깊은 다이빙 기계가 완벽한 정확도로 질문을 이해하고 응답하는 미래를 상상해보십시오. 이것은 공상 과학이 아닙니다. AI의 발전 덕분에 R이되었습니다

대형 언어 모델 (LLM) 및 환각의 피할 수없는 문제 Chatgpt, Claude 및 Gemini와 같은 AI 모델을 사용했을 것입니다. 이들은 대규모 텍스트 데이터 세트에 대해 교육을받은 강력한 AI 시스템의 대형 언어 모델 (LLM)의 예입니다.

최근의 연구에 따르면 AI 개요는 산업 및 검색 유형에 따라 유기 트래픽이 15-64% 감소 할 수 있습니다. 이러한 급격한 변화로 인해 마케팅 담당자는 디지털 가시성에 관한 전체 전략을 재고하게합니다. 새로운

Elon University의 Digital Future Center를 상상 한 최근 보고서는 거의 300 명의 글로벌 기술 전문가를 조사했습니다. 결과적인 보고서 인‘2035 년에 인간이되는 것’은 대부분 AI 시스템의 심화가 T에 대한 우려가 있다고 결론지었습니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
