自动编码器与图像操作
立即解锁
发布时间: 2025-09-01 01:19:30 阅读量: 10 订阅数: 24 AIGC 

### 自动编码器与图像操作
在图像分析和处理领域,自动编码器是一种强大的工具,它可以用于图像分组、生成新图像以及对图像进行对抗攻击等操作。本文将详细介绍卷积自动编码器、变分自动编码器(VAEs)以及如何对图像进行对抗攻击。
#### 1. 卷积自动编码器与图像分组
卷积自动编码器在图像预测方面比普通自动编码器表现更优。为了进一步探索其性能,我们可以尝试改变编码器和解码器中的通道数量,并分析结果的变化。
当图像没有标签时,我们可以基于瓶颈层的值对相似图像进行分组。这里使用t - SNE技术将卷积自动编码器的64维向量压缩到二维空间,使得相似的数据点聚集在一起,不相似的数据点远离彼此。具体步骤如下:
1. **初始化列表**:
```python
latent_vectors = []
classes = []
```
2. **遍历验证数据加载器**:
```python
for im,clss in val_dl:
latent_vectors.append(model.encoder(im).view(len(im),-1))
classes.extend(clss)
```
3. **拼接潜在向量的NumPy数组**:
```python
latent_vectors = torch.cat(latent_vectors).cpu().detach().numpy()
```
4. **导入t - SNE并指定转换维度**:
```python
from sklearn.manifold import TSNE
tsne = TSNE(2)
```
5. **拟合t - SNE**:
```python
clustered = tsne.fit_transform(latent_vectors)
```
6. **绘制数据点**:
```python
fig = plt.figure(figsize=(12,10))
cmap = plt.get_cmap('Spectral', 10)
plt.scatter(*zip(*clustered), c=classes, cmap=cmap)
plt.colorbar(drawedges=True)
```
通过上述操作,我们可以看到同一类别的图像聚集在一起,这证实了瓶颈层的值使得相似的图像具有相似的值。
#### 2. 变分自动编码器(VAEs)
普通自动编码器在处理不在聚类中的嵌入(潜在向量)时,可能无法生成逼真的图像。VAEs可以解决这个问题,它通过生成均值为0、标准差为1的向量,确保生成的图像具有相同的统计特性。
##### 2.1 VAEs的必要性
在深入了解和构建VAEs之前,我们先探讨从不在聚类中的嵌入生成图像的局限性。具体步骤如下:
1. **计算验证图像的潜在向量**:
```python
latent_vectors = []
classes = []
for im,clss in val_dl:
latent_vectors.append(model.encoder(im))
classes.extend(clss)
latent_vectors = torch.cat(latent_vectors).cpu().detach().numpy().reshape(10000, -1)
```
2. **生成随机向量**:
```python
rand_vectors = []
for col in latent_vectors.transpose(1,0):
mu, sigma = col.mean(), col.std()
rand_vectors.append(sigma*torch.randn(1,100) + mu)
```
3. **绘制重构图像**:
```python
rand_vectors=torch.cat(rand_vectors).transpose(1,0).to(device)
fig,ax = plt.subplots(10,10,figsize=(7,7)); ax = iter(ax.flat)
for p in rand_vectors:
img = model.decoder(p.reshape(1,64,2,2)).view(28,28)
show(img, ax=next(ax))
```
从输出结果可以看出,生成的图像清晰度不如之前。VAEs通过指定瓶颈层遵循特定分布来解决这个问题。
##### 2.2 VAEs的工作原理
VAEs的工作策略如下:
1. **编码器输出两个向量**:一个表示均值,另一个表示标准差。
2. **获取修改后的向量**:将均值和标准差(乘以一个随机小数)相加得到修改后的向量。
3. **解码器生成图像**:将修改后的向量作为输入传递给解码器以获取图像。
4. **优化损失值**:损失值是KL散度损失和均方损失的组合。
通过指定均值向量围绕0分布,标准差向量围绕1分布,我们可以训练网络,使得当生成均值为0、标准差为1的随机噪声时,解码器能够生成逼真的图像。
##### 2.3 KL散度
KL散度用于衡量两个数据分布之间的差异。在我们的例子中,我们希望瓶颈特征值遵循均值为0、标准差为1的正态分布。KL散度损失的计算公式如下:
\[
KL divergence = \frac{1}{n}\sum_{i=1}^{n} \left(\frac{\sigma_{i}^{2}+\mu_{i}^{2}}{2}-\log(\sigma_{i}) - \frac{1}{2}\right)
\]
其中,\(\sigma\)和\(\mu\)分别表示每个输入图像的均值和标准差。通过最小化均方误差(\(\mu_{i}^{2}\)),我们确保均值向量接近0;通过公式中的其他项,我们确保标准差向量接近1。
##### 2.4 构建VAEs
以下是构建VAEs以生成手写数字新图像的代码:
1. **步骤1 - 4(与实现普通自动编码器相同)**:
```python
!pip install -q torch_snippets
from torch_snippets import *
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torchvision.utils import make_grid
device = 'cuda' if torch.cuda.is_available() else 'cpu'
train_dataset = datasets.MNIST(root='MNIST/', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='MNIST/', train=False, transform=transforms.ToTensor(), download=True)
train_loader = torch.utils.data.DataLoader(dataset = train_dataset, batch_size=64, shuffle=True)
```
0
0
复制全文
相关推荐









