하지만 (Generative Adversarial Network)는 딥 러닝 내 생성 모델링에 대한 최첨단 접근 방식을 나타내며 종종 다음과 같은 아키텍처를 활용합니다. 컨벌루션 신경망 . 생성 모델링의 목표는 입력 데이터의 패턴을 자동으로 식별하여 모델이 원본 데이터 세트와 유사한 새로운 예를 생성할 수 있도록 하는 것입니다.
이 기사에서는 알아야 할 모든 내용을 다룹니다. GAN, GAN 아키텍처, GAN 작동 방식, GAN 모델 유형 등.
내용의 테이블
- 생성적 적대 신경망(Generative Adversarial Network)이란 무엇입니까?
- GAN의 유형
- GAN의 아키텍처
- GAN은 어떻게 작동하나요?
- GAN 구현
- 생성적 적대 신경망(GAN)의 적용
- GAN의 장점
- GAN의 단점
- GAN(생성적 적대 신경망)- FAQ
생성적 적대 신경망(Generative Adversarial Network)이란 무엇입니까?
생성적 적대 신경망(GAN)은 다음과 같은 용도로 사용되는 강력한 신경망 클래스입니다. 비지도 학습 . GAN은 두 개로 구성된다. 신경망 , 판별자와 생성자. 그들은 실제 데이터와 동일한 인공 데이터를 생성하기 위해 적대적 훈련을 사용합니다.
- 생성기는 무작위 노이즈 샘플을 생성하여 생성된 데이터와 실제 데이터를 정확하게 구별하는 임무를 맡은 판별기를 속이려고 합니다.
- 이러한 경쟁적인 상호 작용의 결과로 현실적인 고품질 샘플이 생산되어 두 네트워크 모두 발전을 이룹니다.
- GAN은 이미지 합성, 스타일 전송 및 텍스트-이미지 합성에서 광범위하게 사용되는 것으로 입증된 것처럼 매우 다재다능한 인공 지능 도구임이 입증되었습니다.
- 그들은 또한 생성 모델링에 혁명을 일으켰습니다.
적대적 훈련을 통해 이러한 모델은 생성기가 현실적인 샘플을 생성하는 데 익숙해질 때까지 경쟁적인 상호 작용에 참여하여 판별자를 약 절반의 시간 동안 속입니다.
생성적 적대 신경망(GAN)은 세 부분으로 나눌 수 있습니다.
- 생성: 확률 모델 측면에서 데이터가 생성되는 방식을 설명하는 생성 모델을 학습합니다.
- 적대적: 적대적이라는 단어는 한 가지를 다른 것에 대항하는 것을 의미합니다. 이는 GAN의 맥락에서 생성 결과가 데이터 세트의 실제 이미지와 비교됨을 의미합니다. 판별기라고 알려진 메커니즘을 사용하여 실제 이미지와 가짜 이미지를 구별하는 모델을 적용합니다.
- 네트워크: 훈련 목적으로 심층 신경망을 인공 지능(AI) 알고리즘으로 사용합니다.
GAN의 유형
- 바닐라 GAN: 이것은 가장 간단한 유형의 GAN입니다. 여기서 Generator와 Discriminator는 기본적으로 간단합니다. 다층 퍼셉트론 . 바닐라 GAN의 알고리즘은 정말 간단합니다. 다음을 사용하여 수학 방정식을 최적화하려고 시도합니다. 확률적 경사하강법.
- 조건부 GAN(CGAN): CGAN 로 설명될 수 있다 딥러닝 방법 일부 조건부 매개변수가 적용됩니다. .
- CGAN에서는 해당 데이터를 생성하기 위해 Generator에 추가 매개변수 'y'가 추가됩니다.
- Discriminator가 실제 데이터와 가짜 생성 데이터를 구별하는 데 도움이 되도록 Discriminator에 대한 입력에도 레이블이 추가됩니다.
- 심층 컨볼루셔널 GAN(DCGAN): DCGAN GAN의 가장 인기 있고 가장 성공적인 구현 중 하나입니다. 으로 구성되어 있습니다. ConvNet 대신에 다층 퍼셉트론 .
- ConvNet은 최대 풀링 없이 구현되며 실제로는 컨볼루셔널 스트라이드로 대체됩니다.
- 또한 레이어가 완전히 연결되지 않았습니다.
- 라플라시안 피라미드 GAN(LAPGAN): 그만큼 라플라시안 피라미드 한 옥타브 떨어진 대역 통과 이미지 세트와 저주파수 잔여 이미지로 구성된 선형 반전 가능 이미지 표현입니다.
- 이 접근법 여러 개의 생성기 및 판별기 네트워크를 사용합니다. 그리고 다양한 수준의 라플라시안 피라미드.
- 이 접근 방식은 매우 높은 품질의 이미지를 생성하기 때문에 주로 사용됩니다. 이미지는 처음에 피라미드의 각 레이어에서 다운 샘플링된 다음 이미지가 원래 크기에 도달할 때까지 이러한 레이어의 조건부 GAN에서 약간의 노이즈를 획득하는 역방향 패스의 각 레이어에서 다시 확대됩니다.
- 초해상도 GAN(SRGAN): 스르간 이름에서 알 수 있듯이 GAN을 설계하는 방법입니다. 심층 신경망 고해상도 이미지를 생성하기 위해 적대적 네트워크와 함께 사용됩니다. 이러한 유형의 GAN은 기본 저해상도 이미지를 최적으로 확대하여 오류를 최소화하면서 세부 정보를 향상시키는 데 특히 유용합니다.
GAN의 아키텍처
GAN(Generative Adversarial Network)은 생성기와 판별기라는 두 가지 주요 부분으로 구성됩니다.
발전기 모델
GAN(Generative Adversarial Network)에서 신선하고 정확한 데이터를 생성하는 핵심 요소는 생성기 모델입니다. 생성기는 임의의 노이즈를 입력으로 받아 이를 텍스트나 이미지와 같은 복잡한 데이터 샘플로 변환합니다. 일반적으로 심층 신경망으로 묘사됩니다.
훈련 데이터의 기본 분포는 훈련을 통해 설계할 때 학습 가능한 매개변수 계층으로 캡처됩니다. 생성기는 매개변수를 미세 조정하기 위해 역전파를 사용하여 훈련되는 동안 실제 데이터를 거의 모방하는 샘플을 생성하기 위해 출력을 조정합니다.
판별자를 속일 수 있는 고품질의 다양한 샘플을 생성하는 생성기의 능력이 이 생성기를 성공으로 이끄는 이유입니다.
발전기 손실
GAN에서 생성기의 목적은 판별기를 속일 수 있을 만큼 현실적인 합성 샘플을 생성하는 것입니다. 생성기는 손실 함수를 최소화하여 이를 달성합니다.
어디,
J_G 생성기가 판별자를 얼마나 잘 속이고 있는지 측정합니다.- 통나무
D(G(z_i) ) 생성된 샘플에 대해 판별자가 올바른 로그 확률을 나타냅니다. - 생성기는 이러한 손실을 최소화하여 판별기가 실제 샘플로 분류하는 샘플의 생성을 장려하는 것을 목표로 합니다.
(log D(G(z_i)) , 1에 가깝습니다.
판별자 모델
생성적 적대 신경망(GAN)에서는 판별자 모델이라는 인공 신경망을 사용하여 생성된 입력과 실제 입력을 구별합니다. 입력 샘플을 평가하고 진위 확률을 할당함으로써 판별자는 이진 분류기로 기능합니다.
시간이 지남에 따라 판별자는 데이터세트의 실제 데이터와 생성자가 생성한 인공 샘플을 구별하는 방법을 학습합니다. 이를 통해 매개변수를 점진적으로 연마하고 숙련도를 높일 수 있습니다.
컨벌루션 레이어 또는 다른 양식에 대한 관련 구조는 일반적으로 사진 데이터를 처리할 때 아키텍처에서 사용됩니다. 생성된 샘플을 사기로, 실제 샘플을 진짜로 정확하게 식별하는 판별기의 능력을 최대화하는 것이 적대적 훈련 절차의 목표입니다. Discriminator는 Generator와 Discriminator의 상호 작용으로 인해 점점 더 차별적으로 성장하며, 이는 GAN이 전체적으로 매우 현실적으로 보이는 합성 데이터를 생성하는 데 도움이 됩니다.
판별자 손실
판별자는 생성된 샘플과 실제 샘플을 모두 올바르게 분류할 수 있는 음의 로그 우도를 줄입니다. 이러한 손실은 판별자가 생성된 샘플을 다음 방정식을 사용하여 가짜 샘플과 실제 샘플로 정확하게 분류하도록 장려합니다.
J_D 생산된 샘플과 실제 샘플을 식별하는 판별기의 능력을 평가합니다.- 판별자가 실제 데이터를 정확하게 분류할 로그 가능성은 다음과 같이 표시됩니다.
logD(x_i) . - 판별자가 생성된 샘플을 가짜로 올바르게 분류할 로그 확률은 다음과 같이 표시됩니다.
log(1-D(G(z_i))) . - 판별자는 인공 샘플과 실제 샘플을 정확하게 식별하여 이러한 손실을 줄이는 것을 목표로 합니다.
최소최대 손실
GAN(Generative Adversarial Network)에서 최소최대 손실 공식은 다음과 같이 제공됩니다.
어디,
- G는 생성자 네트워크이고 D는 판별자 네트워크입니다.
- 실제 데이터 분포에서 얻은 실제 데이터 샘플
p_{data}(x) x로 표현됩니다. - 이전 분포에서 샘플링된 무작위 노이즈
p_z(z) (보통 정규 또는 균일 분포)는 z로 표시됩니다. - D(x)는 판별자가 실제 데이터를 실제 데이터로 정확하게 식별할 가능성을 나타냅니다.
- D(G(z))는 판별자가 생성자에서 생성된 데이터를 진짜로 식별할 가능성입니다.

GAN은 어떻게 작동하나요?
GAN 작동 방식과 관련된 단계는 다음과 같습니다.
- 초기화: 생성기(G)와 판별기(D)라는 두 개의 신경망이 생성됩니다.
- G는 실제 데이터와 매우 유사한 이미지나 텍스트와 같은 새로운 데이터를 생성하는 임무를 맡고 있습니다.
- D는 훈련 데이터 세트의 실제 데이터와 G가 생성한 데이터를 구별하는 비평가 역할을 합니다.
- 발전기의 첫 번째 이동: G는 임의의 노이즈 벡터를 입력으로 사용합니다. 이 노이즈 벡터는 임의의 값을 포함하며 G 생성 프로세스의 시작점 역할을 합니다. G는 내부 레이어와 학습된 패턴을 사용하여 노이즈 벡터를 생성된 이미지와 같은 새로운 데이터 샘플로 변환합니다.
- 판별자의 차례: D는 두 가지 종류의 입력을 받습니다.
- 훈련 데이터 세트의 실제 데이터 샘플입니다.
- 이전 단계에서 G가 생성한 데이터 샘플입니다. D의 임무는 각 입력을 분석하고 그것이 실제 데이터인지 G가 조작한 것인지 판단하는 것입니다. 0과 1 사이의 확률 점수를 출력합니다. 점수가 1이면 데이터가 진짜일 가능성이 높고 0은 가짜일 가능성이 있음을 나타냅니다.
- 학습 과정: 이제 적대적인 부분이 등장합니다.
- D가 실제 데이터를 실제(1에 가까운 점수)로 올바르게 식별하고 생성된 데이터를 가짜(0에 가까운 점수)로 식별하면 G와 D 모두 약간의 보상을 받습니다. 둘 다 자기 일을 잘하고 있기 때문이다.
- 그러나 중요한 것은 지속적으로 개선하는 것입니다. D가 일관되게 모든 것을 정확하게 식별한다면 많은 것을 배우지 못할 것입니다. 따라서 G가 결국 D를 속이는 것이 목표입니다.
- 발전기 개선:
- D가 실수로 G의 창작물을 실제라고 표시했다면(1점에 가까운 점수) 이는 G가 올바른 길을 가고 있다는 신호입니다. 이 경우 G는 상당히 긍정적인 업데이트를 받는 반면, D는 속아서 페널티를 받습니다.
- 이 피드백은 G가 생성 프로세스를 개선하여 보다 현실적인 데이터를 생성하는 데 도움이 됩니다.
- 판별자의 적응:
- 반대로 D가 G의 가짜 데이터를 올바르게 식별했지만(0에 가까운 점수) G가 보상을 받지 못한 경우 D의 식별 능력은 더욱 강화됩니다.
- G와 D 사이의 지속적인 결투는 시간이 지남에 따라 두 네트워크를 모두 개선합니다.
훈련이 진행됨에 따라 G는 현실적인 데이터를 더 잘 생성하므로 D가 차이점을 구별하기가 더 어려워집니다. 이상적으로 G는 너무 능숙해져서 D는 진짜 데이터와 가짜 데이터를 확실하게 구별할 수 없습니다. 이 시점에서 G는 잘 훈련된 것으로 간주되며 새롭고 현실적인 데이터 샘플을 생성하는 데 사용될 수 있습니다.
자바 정규식
생성적 적대 신경망(GAN) 구현
우리는 GAN이 어떻게 구현되는지 이해하기 위한 단계를 따르고 이해할 것입니다.
1단계: 필수 라이브러리 가져오기
파이썬3
import> torch> import> torch.nn as nn> import> torch.optim as optim> import> torchvision> from> torchvision>import> datasets, transforms> import> matplotlib.pyplot as plt> import> numpy as np> # Set device> device>=> torch.device(>'cuda'> if> torch.cuda.is_available()>else> 'cpu'>)> |
For training on the CIFAR-10 image dataset, this PyTorch module creates a Generative Adversarial Network (GAN), switching between generator and discriminator training. Visualization of the generated images occurs every tenth epoch, and the development of the GAN is tracked. Step 2: Defining a TransformThe code uses PyTorch’s transforms to define a simple picture transforms.Compose. It normalizes and transforms photos into tensors. Python3 # Define a basic transform transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) Step 3: Loading the Dataset A CIFAR-10 dataset is created for training with below code, which also specifies a root directory, turns on train mode, downloads if needed, and applies the specified transform. Subsequently, it generates a 32-batch DataLoader and shuffles the training set of data. Python3 train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) Step 4: Defining parameters to be used in later processes A Generative Adversarial Network (GAN) is used with specified hyperparameters. The latent space’s dimensionality is represented by latent_dim. lr is the optimizer’s learning rate. The coefficients for the Adam optimizer are beta1 and beta2. To find the total number of training epochs, use num_epochs. Python3 # Hyperparameters latent_dim = 100 lr = 0.0002 beta1 = 0.5 beta2 = 0.999 num_epochs = 10 Step 5: Defining a Utility Class to Build the Generator The generator architecture for a GAN in PyTorch is defined with below code. From nn.Module , the Generator class inherits. It is comprised of a sequential model with Tanh, linear, convolutional, batch normalization, reshaping, and upsampling layers. The neural network synthesizes an image (img) from a latent vector (z), which is the generator’s output. The architecture uses a series of learned transformations to turn the initial random noise in the latent space into a meaningful image. Python3 # Define the generator class Generator(nn.Module): def __init__(self, latent_dim): super(Generator, self).__init__() self.model = nn.Sequential( nn.Linear(latent_dim, 128 * 8 * 8), nn.ReLU(), nn.Unflatten(1, (128, 8, 8)), nn.Upsample(scale_factor=2), nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.BatchNorm2d(128, momentum=0.78), nn.ReLU(), nn.Upsample(scale_factor=2), nn.Conv2d(128, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64, momentum=0.78), nn.ReLU(), nn.Conv2d(64, 3, kernel_size=3, padding=1), nn.Tanh() ) def forward(self, z): img = self.model(z) return img Step 6: Defining a Utility Class to Build the Discriminator The PyTorch code describes the discriminator architecture for a GAN. The class Discriminator is descended from nn.Module. It is composed of linear layers, batch normalization, dropout , convolutional, LeakyReLU , and sequential layers. An image (img) is the discriminator’s input, and its validity—the probability that the input image is real as opposed to artificial—is its output. Python3 # Define the discriminator class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.model = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1), nn.LeakyReLU(0.2), nn.Dropout(0.25), nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1), nn.ZeroPad2d((0, 1, 0, 1)), nn.BatchNorm2d(64, momentum=0.82), nn.LeakyReLU(0.25), nn.Dropout(0.25), nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1), nn.BatchNorm2d(128, momentum=0.82), nn.LeakyReLU(0.2), nn.Dropout(0.25), nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(256, momentum=0.8), nn.LeakyReLU(0.25), nn.Dropout(0.25), nn.Flatten(), nn.Linear(256 * 5 * 5, 1), nn.Sigmoid() ) def forward(self, img): validity = self.model(img) return validity Step 7: Building the Generative Adversarial Network The code snippet defines and initializes a discriminator (Discriminator) and a generator (Generator). The designated device (GPU if available) receives both models. Binary Cross Entropy Loss, which is frequently used for GANs, is selected as the loss function (adversarial_loss). For the generator (optimizer_G) and discriminator (optimizer_D), distinct Adam optimizers with predetermined learning rates and betas are also defined. Python3 # Define the generator and discriminator # Initialize generator and discriminator generator = Generator(latent_dim).to(device) discriminator = Discriminator().to(device) # Loss function adversarial_loss = nn.BCELoss() # Optimizers optimizer_G = optim.Adam(generator.parameters() , lr=lr, betas=(beta1, beta2)) optimizer_D = optim.Adam(discriminator.parameters() , lr=lr, betas=(beta1, beta2)) Step 8: Training the Generative Adversarial Network For a Generative Adversarial Network (GAN), the code implements the training loop. The training data batches are iterated through during each epoch. Whereas the generator (optimizer_G) is trained to generate realistic images that trick the discriminator, the discriminator (optimizer_D) is trained to distinguish between real and phony images. The generator and discriminator’s adversarial losses are computed. Model parameters are updated by means of Adam optimizers and the losses are backpropagated. Discriminator printing and generator losses are used to track progress. For a visual assessment of the training process, generated images are additionally saved and shown every 10 epochs. Python3 # Training loop for epoch in range(num_epochs): for i, batch in enumerate(dataloader): # Convert list to tensor real_images = batch[0].to(device) # Adversarial ground truths valid = torch.ones(real_images.size(0), 1, device=device) fake = torch.zeros(real_images.size(0), 1, device=device) # Configure input real_images = real_images.to(device) # --------------------- # Train Discriminator # --------------------- optimizer_D.zero_grad() # Sample noise as generator input z = torch.randn(real_images.size(0), latent_dim, device=device) # Generate a batch of images fake_images = generator(z) # Measure discriminator's ability # to classify real and fake images real_loss = adversarial_loss(discriminator (real_images), valid) fake_loss = adversarial_loss(discriminator (fake_images.detach()), fake) d_loss = (real_loss + fake_loss) / 2 # Backward pass and optimize d_loss.backward() optimizer_D.step() # ----------------- # Train Generator # ----------------- optimizer_G.zero_grad() # Generate a batch of images gen_images = generator(z) # Adversarial loss g_loss = adversarial_loss(discriminator(gen_images), valid) # Backward pass and optimize g_loss.backward() optimizer_G.step() # --------------------- # Progress Monitoring # --------------------- if (i + 1) % 100 == 0: print( f'Epoch [{epoch+1}/{num_epochs}] Batch {i+1}/{len(dataloader)} ' f'Discriminator Loss: {d_loss.item():.4f} ' f'Generator Loss: {g_loss.item():.4f}' ) # Save generated images for every epoch if (epoch + 1) % 10 == 0: with torch.no_grad(): z = torch.randn(16, latent_dim, device=device) generated = generator(z).detach().cpu() grid = torchvision.utils.make_grid(generated, nrow=4, normalize=True) plt.imshow(np.transpose(grid, (1, 2, 0))) plt.axis('off') plt.show() Output: Epoch [10/10] Batch 1300/1563 Discriminator Loss: 0.4473 Generator Loss: 0.9555 Epoch [10/10] Batch 1400/1563 Discriminator Loss: 0.6643 Generator Loss: 1.0215 Epoch [10/10] Batch 1500/1563 Discriminator Loss: 0.4720 Generator Loss: 2.5027 GAN Output Application Of Generative Adversarial Networks (GANs)GANs, or Generative Adversarial Networks, have many uses in many different fields. Here are some of the widely recognized uses of GANs: Image Synthesis and Generation : GANs are often used for picture synthesis and generation tasks, They may create fresh, lifelike pictures that mimic training data by learning the distribution that explains the dataset. The development of lifelike avatars, high-resolution photographs, and fresh artwork have all been facilitated by these types of generative networks. Image-to-Image Translation : GANs may be used for problems involving image-to-image translation, where the objective is to convert an input picture from one domain to another while maintaining its key features. GANs may be used, for instance, to change pictures from day to night, transform drawings into realistic images, or change the creative style of an image. Text-to-Image Synthesis : GANs have been used to create visuals from descriptions in text. GANs may produce pictures that translate to a description given a text input, such as a phrase or a caption. This application might have an impact on how realistic visual material is produced using text-based instructions. Data Augmentation : GANs can augment present data and increase the robustness and generalizability of machine-learning models by creating synthetic data samples. Data Generation for Training : GANs can enhance the resolution and quality of low-resolution images. By training on pairs of low-resolution and high-resolution images, GANs can generate high-resolution images from low-resolution inputs, enabling improved image quality in various applications such as medical imaging, satellite imaging, and video enhancement.Advantages of GANThe advantages of the GANs are as follows: Synthetic data generation : GANs can generate new, synthetic data that resembles some known data distribution, which can be useful for data augmentation, anomaly detection, or creative applications. High-quality results : GANs can produce high-quality, photorealistic results in image synthesis, video synthesis, music synthesis, and other tasks. Unsupervised learning : GANs can be trained without labeled data, making them suitable for unsupervised learning tasks, where labeled data is scarce or difficult to obtain. Versatility : GANs can be applied to a wide range of tasks, including image synthesis, text-to-image synthesis, image-to-image translation, anomaly detection , The disadvantages of the GANs are as follows: Training Instability : GANs can be difficult to train, with the risk of instability, mode collapse, or failure to converge. Computational Cost : GANs can require a lot of computational resources and can be slow to train, especially for high-resolution images or large datasets. Overfitting : GANs can overfit the training data, producing synthetic data that is too similar to the training data and lacking diversity. Bias and Fairness : GANs can reflect the biases and unfairness present in the training data, leading to discriminatory or biased synthetic data. Interpretability and Accountability : GANs can be opaque and difficult to interpret or explain, making it challenging to ensure accountability, transparency, or fairness in their applications.GAN(Generative Adversarial Network)- FAQs Q1. What is a Generative Adversarial Network(GAN)?An artificial intelligence model known as a GAN is made up of two neural networks—a discriminator and a generator—that were developed in tandem using adversarial training. The discriminator assesses the new data instances for authenticity, while the generator produces new ones. Q2. What are the main applications of GAN?Generating images and videos, transferring styles, enhancing data, translating images to other images, producing realistic synthetic data for machine learning model training, and super-resolution are just a few of the many uses for GANs. Q3. What challenges do GAN face?GANs encounter difficulties such training instability, mode collapse (when the generator generates a limited range of samples), and striking the correct balance between the discriminator and generator. It’s frequently necessary to carefully build the model architecture and tune the hyperparameters. Q4. How are GAN evaluated?The produced samples’ quality, diversity, and resemblance to real data are the main criteria used to assess GANs. For quantitative assessment, metrics like the Fréchet Inception Distance (FID) and Inception Score are frequently employed. Q5. Can GAN be used for tasks other than image generation ?Yes, different tasks can be assigned to GANs. Text, music, 3D models, and other things have all been generated with them. The usefulness of conditional GANs is expanded by enabling the creation of specific content under certain input conditions. Q6. What are some famous architectures of GANs ?A few well-known GAN architectures are Progressive GAN (PGAN), Wasserstein GAN (WGAN), Conditional GAN (cGAN), Deep Convolutional GAN (DCGAN), and Vanilla GAN. Each has special qualities and works best with particular kinds of data and tasks.>