这段代码是用于对高光谱图像进行降维和分类的。具体流程如下:
使用PCA(主成分分析)进行降维,得到保留99.9%总数据方差的主成分。
将图像像素投影到剩余的主成分上,降低图像像素的维数。
使用高斯最大似然分类器对约简后的主成分进行训练,并根据训练数据进行分类。
最后将分类结果可视化输出。
其中,create_training_classes()函数用于创建训练类别,GaussianClassifier()函数用于创建高斯最大似然分类器,classi fy_image()函数用于进行分类,imshow()函数用于可视化输出图像。
还请提供有一些数据
import matplotlib.pyplot as plt
from scipy.io import loadmat
import spectral as spy
# PCA主成分分析
def pca_dr(src):
pc = spy.principal_components(src)
pc_98 = pc.reduce(fraction=0.98) # 保留98%的特征值
print(len(pc_98.eigenvalues)) # 剩下的特征值数量
spy.imshow(data=pc.cov, title="pc_cov")
img_pc = pc_98.transform(input_image) # 把数据转换到主成分空间
spy.imshow(img_pc[:, :, :3], stretch_all=True) # 前三个主成分显示
return img_pc
# LDA线性判别
def lda_dr(src, gt):
classes = spy.create_training_classes(src, gt)
fld = spy.linear_discriminant(classes)
print(len(fld.eigenvalues))
img_fld = fld.transform(src)
spy.imshow(img_fld[:, :, :3])
return img_fld
input_image = loadmat('D:/Hyper/Indian_pines_corrected.mat')['indian_pines_corrected']
gt = loadmat("D:/Hyper/Indian_pines_gt.mat")['indian_pines_gt']
pca_dr(input_image)
lda_dr(input_image, gt)
plt.pause(60)
不知道你这个问题是否已经解决, 如果还没有解决的话:在生成领域,自编码器是GAN的前身,今天用VAE在MNIST做了生成实验,图1是10个class到latent space的投影,从投影就可以看出,同一类会尽量分在一起,说明latent space是很好的表示。图2是解码器输出的情况。整个流程就是图像-》编码器-》采用-》解码器-》图像
图一
图二
另外今天在跑实验的时候由于vs code的terminal,系统terminal在进入conda环境后对应的python的路径不同,会导致调包的时候出现混乱,揪出这个问题花了不少时间,同学们如果有时候发现安装的包和代码实际使用时的不一致,可能会是这个原因。
PGGAN实验:
训练比较麻烦,用tfhub上预训练好的
结果如下
SGAN(半监督GAN),和一般GAN不同,SGAN训练完成后用的是D,将D训练为分类器,可以在半监督场景下取得好的表现。实验结果表明,在有标签的数据量相同时,使用GAN训练出的D用作分类器时与相同架构的单独训练出的分类器相比,泛化性能更好
CGAN,换了个x和y叠加的方式跑CGAN,似乎效果更好,上次做的实验是直接把标签放到噪声向量后面去了,这次是将标签embed为和噪声向量相同维度的稠密向量,然后将其与噪声向量相乘作为G的input’
CycleGAN,设计得很漂亮,代码量也很大,跑了一会儿就报错了,定位比较麻烦
对抗样本实验,梯度下降直接跑,针对inception v3进行定向攻击,把我从运动衫识别成了书架。书架这个定向标签可以随意指定,只要inception v3有就可以
对抗噪声实验,把对抗噪声叠加到任何图像上都会导致定向误分类(这里是分类到3)
迁移学习
预测叉子时效果不好,是因为inception在imagenet上训练,训练集中只有10多张叉子的图片;跑CIFAR-10时效果不错
使用谷歌19年公开的技术NSL(神经结构化学习),利用其对抗性正则化,在训练过程中注入对抗损失进行对抗训练,结果如右,进一步利用其他生产对抗扰动的方法对训练好的模型进行攻击,证明模型会再次被攻击(也就是证明了说一种对抗技术进行对抗训练得到的模型无法抵御另一种技术的对抗攻击),把图中的花识别成了郁金香
平滑对抗训练(smooth adversarial training),学界指出RELU会影响模型的对抗鲁棒性,更平滑的激活函数可以得到更好的梯度,使得在生成harder 对抗样本,如果在此基础上进行训练,那么模型在面对对抗样本时就有更好的鲁棒性。建议使用Swish,GELU等代替,这次就做了相关实验。首先分别训练RELU,GELU和Swish模型,他们在正常数据的测试集上accuracy差不多。然后进行对抗测试:1)在Relu模型上生成对抗样本,然后使用该模型自身在生成的对抗样本上进行评估;并在RELU,Swish上重复,结果可以看到Relu差了很多;2)在Swish上生成对抗样本,Relu模型在其上测试;反过来再实验,可以看到前者效果更好;3)加入nsl对抗正则化进行实验得到swish-adv模型,将其与swish比较,可以看到加了对抗正则化的其效果更好
RNN(GRU)做时间序列预测,预测天气,从结果可以看到效果还不错,主要是学了早停+callback_function+checkpoint(在模型停止训练之前可能在测试集上性能就变差了,所以在推理时用最好保存的检查点的权重来用)
实现编码器-解码器做机器翻译,从翻译结果和真实结果来看,虽然不是一模一样,但是语义是相近的
这个需要结合你所用到的数据,进行具体分析原因