我正在尝试比较通过生成对抗网络(GAN)生成的样本(例如MNIST数字图像)。在我的第一个实验中,GAN训练不成功,因此生成的样本与真实的MNIST图像不相似。在我的第二个实验中,GAN训练非常成功,因此生成的样本应该能在可视化图表中与真实的MNIST样本很好地重叠。
上面的示例图展示了我希望达到的效果:
- 第一张图展示了原始真实图像的分布
- 第二张图展示了GAN1的结果与真实数据重叠得不好
- 第三张图展示了GAN2的结果与真实数据重叠得很好。
有人能提供一些指导,告诉我用Python绘制这样的图表的好方法吗?并提供一些使用以下代码片段作为示例数据/代码(摘自这里)的代码来绘图?
from sklearn.manifold import TSNEfrom keras.datasets import mnistimport seaborn as snsimport pandas as pd (x_train, y_train), (_ , _) = mnist.load_data()x_train = x_train[:3000]y_train = y_train[:3000]x_mnist = reshape(x_train, [x_train.shape[0], x_train.shape[1]*x_train.shape[2]])tsne = TSNE(n_components=2, verbose=1, random_state=123)z = tsne.fit_transform(x_mnist)df = pd.DataFrame()df["y"] = y_traindf["comp-1"] = z[:,0]df["comp-2"] = z[:,1]sns.scatterplot(x="comp-1", y="comp-2", hue=df.y.tolist(), palette=sns.color_palette("hls", 10), data=df).set(title="MNIST data T-SNE projection")
回答:
你可以尝试使用降维方法,如PCA、t-SNE、LLE或UMAP,将图像的维度降至2,然后绘制图像,如你所指出的那样。
以下是Python中的示例代码:
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.decomposition import PCAfrom sklearn.manifold import TSNEX_real = ... # 真实图像,例如1000个作为向量的图像 X_gan = ... # 来自GAN的生成图像,具有相同形状X = np.vstack([X_real, X_gan]) # 垂直堆叠矩阵X_pca = PCA(n_components=50).fit_transform(X) # 对于高维数据,建议先降低维度(例如50),然后再使用t-SNEX_embedded = TSNE(n_components=2).fit_transform(X_pca)# 使用相应的类和方法标签绘制点plt.scatter(...)
除了t-SNE,你也可以直接使用PCA或上述提到的其他方法之一。