基于互信息最大化的无监督学习图像特征表示------P02114198田园,P02114018刘颖,P02114050刘欣让

本文主要是介绍基于互信息最大化的无监督学习图像特征表示------P02114198田园,P02114018刘颖,P02114050刘欣让,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在概率论和信息论中,两个随机变量的互信息衡量了两个变量之间相互依赖的程度。通俗来说可以理解为两个变量交叠的信息,对于两个随机变量,互信息衡量了一个随机变量平均传达了多少关于另一个的信息。

正式地,两个离散随机变量X和Y的互信息可以定义为:I(X;Y)=\sum_{y\in Y}^{}\sum_{x\in X}^{}p(x,y)\log (\frac{p(x,y)}{p(x)p(y)})

其中p(x,y)XY联合概率分布函数,而p(x)p(y)分别是XY的边缘概率函数分布

在连续随机变量的情形下,求和被替换成了二重定积分:

I(X;Y)=\int_{Y}^{}\int_{X}^{}p(x,y)\log (\frac{p(x,y)}{p(x)p(y)})dxdy

其中p(x,y)XY联合概率密度函数,而p(x)p(y)分别是XY的边缘概率密度函数

互信息量I(x_{i};y_{j})在联合概率空间P(XY)中的统计平均值。平均互信息I(X;Y)克服了互信息量I(x_{i};y_{j})的随机性,成为一个确定的量。如果对数以2为基底,互信息的单位是bit

许多表示学习算法使用像素级的训练目标,当只有一小部分信号在语义层面上起作用时是不利的。Bengio 等研究者假设应该更直接地根据信息内容和统计或架构约束来学习表示,据此提出了Deep INFOMAX(DIM)。该方法可用于学习期望特征的表示,并且在分类任务上优于许多流行的无监督学习方法。他们认为,这是学习更好的和更条理的表示的一个重要方向,有利于未来的人工智能研究。

X表示原始图像的集合,用x\in X表示某一原始图像,Z表示编码向量的集合,z\in Z表示某个编码向量,p(z|x)表示x所产生的编码向量的分布,我们设它为高斯分布,或者简单理解它就是我们想要寻找的编码器。那么可以用互信息来表示X,Z的相关性。

I(X,Z)=\iint_{}^{}p(z|x)\widetilde{p}(x)\log \frac{p(z|x)}{p(z)}dxdz

这里的\widetilde{p}(x)原始数据的分布,p(z)是在p(z|x)给定之后整个Z的分布,即:

p(z)=\int p(z|x)\widetilde{p}(x)dx

那么一个好的特征编辑器,应该要使得互信息尽量的大,即:

p(z|x)=\max I(X,Z)

互信息越大意味着(大部分的)\log \frac{p(z|x)}{p(z)}应当尽量大,这意味着p(z|x)应当远大于p(z),即对于每个x,编码器能找出专属于x的那个z,使得p(z|x)的概率远大于随机的概率p(z)。这样一来,就有能力只通过z就从中分辨出原始样本来。

接下来进行最大化互信息,互信息的定义式稍微变换后如下:I(X,Z)=\iint_{}^{}p(z|x)\widetilde{p}(x)\log \frac{p(z|x)\widetilde{p}(x)}{p(z)\widetilde{p}(x)}dxdz=KL(p(z|x)\widetilde{p}(x)||p(z)\widetilde{p}(x))

这个形式揭示了互信息的本质含义:p(z|x)\widetilde{p}(x)描述了两个变量x,z的联合分布,p(z)\widetilde{p}(x)则是随机抽取一个x和一个z时的分布(假设它们两个不相关时),而互信息则是这两个分布的KL散度。而所谓最大化互信息,就是要拉大p(z|x)\widetilde{p}(x)p(z)\widetilde{p}(x)之间的距离。

全局互信息

全局互信息是指两个随机变量之间的互信息,它是一个大于等于0的实数,且满足以下条件:当两个随机变量独立时,它们的全局互信息为1;当两个随机变量不独立时,它们的全局互信息的取值范围为[0, 1/2]。

计算全局互信息的方法有很多种,其中一种常用的方法是使用贝叶斯公式。具体来说,对于两个离散随机变量X和Y,它们的全局互信息I(X;Y)可以表示为:

I(X;Y)=\sum p(x,y)\log p(y|x)

其中p(x,y)表示在给定x的情况下y发生的概率,\log p(y|x)表示在给定x的情况下y发生条件概率对数。

局部互信息

由于图片的相关性更多体现在局部中。换言之,图片的识别、分类等应该是一个从局部到整体的过程。因此,有必要把“局部互信息”也考虑进来。

通过 CNN 进行编码的过程一般是:

 

已经考虑了xz的关联,那么中间层特征(feature map)和z的关联呢?我们记中间层特征为 \left \{ C_{ij}^{} (x)|i=1,2,...,h;j=1,2,...,w\right \}也就是视为h\times w个向量的集合,我们也去算这h\times w个向量跟zx的互信息,称为“局部互信息”。

估算方法跟全局是一样的,将每一个C_{ij}^{}(x)zx拼接起来得到\left [ C_{ij}(x),zx \right ],相当于得到了一个更大的 feature map,然后对这个 feature map 用多个1x1的卷积层来作为局部互信息的估算网络 Tlocal。

下面的代码使用Python实现,可以计算XY两个向量的最大互信息。具体地,代码将XY的值分成若干个区间(bin),并使用numpy.histogram2d()函数计算这些区间中XY同时出现的次数。接着,使用 shan_entropy()函数计算XYXY的熵,最后使用这些熵值计算最大互信息。

import numpy as np
from sklearn.metrics import mutual_info_scoredef max_mutual_information(X, y):"""计算最大互信息:param X: 特征矩阵,形状为 (n_samples, n_features):param y: 标签向量,形状为 (n_samples,):return: 最大互信息值"""mi = mutual_info_score(y, X)max_mi = mifor i in range(X.shape[1]):for j in range(i+1, X.shape[1]):new_mi = mutual_info_score(y, X[:, [i, j]])if new_mi > max_mi:max_mi = new_mireturn max_mi# 示例
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 1, 0, 1])
result = max_mutual_information(X, y)
print("最大互信息值:", result)

下面这段代码是基于Deep InfoMax模型的,用于无监督学习图像特征表示。它首先定义了一些参数,如隐变量维度、全局互信息和局部互信息的比重等。然后,它使用卷积神经网络(CNN)对输入图像进行编码,并使用重参数技巧生成潜在空间中的样本。接下来,它定义了全局判别器和局部判别器,分别用于计算全局和局部信息损失。最后,它训练了一个模型来学习这些信息损失,并输出了编码器的特征。此外,它还提供了一个采样函数,可以从潜在空间中随机选择一张图片,并输出与这张图片最相近的图片。

import numpy as np
import glob
import imageio
from scipy import misc
from keras.models import Model
from keras.layers import *
from keras import backend as K
from keras.optimizers import Adam
from tqdm import tqdm
import tensorflow as tfimgs = glob.glob('tiny-imagenet-200/train/*/images/*')
np.random.shuffle(imgs)def imread(f):x = misc.imread(f, mode='RGB')return x.astype(np.float32) / 255 * 2 - 1x_train = np.array([imread(f) for f in tqdm(iter(imgs))])
img_dim = x_train.shape[1]z_dim = 256 # 隐变量维度
alpha = 0.5 # 全局互信息的loss比重
beta = 1.5 # 局部互信息的loss比重
gamma = 0.01 # 先验分布的loss比重# 编码器(卷积与最大池化)
x_in = Input(shape=(img_dim, img_dim, 3))
x = x_infor i in range(4):x = Conv2D(z_dim // 2**(3-i),kernel_size=(3,3),padding='SAME')(x)x = BatchNormalization()(x)x = LeakyReLU(0.2)(x)x = MaxPooling2D((2, 2))(x)feature_map = x # 截断到这里,认为到这里是feature_map(局部特征)
feature_map_encoder = Model(x_in, x)for i in range(2):x = Conv2D(z_dim,kernel_size=(3,3),padding='SAME')(x)x = BatchNormalization()(x)x = LeakyReLU(0.2)(x)x = GlobalMaxPooling2D()(x) # 全局特征z_mean = Dense(z_dim)(x) # 均值,也就是最终输出的编码
z_log_var = Dense(z_dim)(x) # 方差,这里都是模仿VAE的encoder = Model(x_in, z_mean) # 总的编码器就是输出z_mean# 重参数技巧
def sampling(args):z_mean, z_log_var = argsu = K.random_normal(shape=K.shape(z_mean))return z_mean + K.exp(z_log_var / 2) * u# 重参数层,相当于给输入加入噪声
z_samples = Lambda(sampling)([z_mean, z_log_var])
prior_kl_loss = - 0.5 * K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var))# shuffle层,打乱第一个轴
def shuffling(x):idxs = K.arange(0, K.shape(x)[0])idxs = tf.random_shuffle(idxs)return K.gather(x, idxs)# 与随机采样的特征拼接(全局)
z_shuffle = Lambda(shuffling)(z_samples)
z_z_1 = Concatenate()([z_samples, z_samples])
z_z_2 = Concatenate()([z_samples, z_shuffle])# 与随机采样的特征拼接(局部)
feature_map_shuffle = Lambda(shuffling)(feature_map)
z_samples_repeat = RepeatVector(4 * 4)(z_samples)
z_samples_map = Reshape((4, 4, z_dim))(z_samples_repeat)
z_f_1 = Concatenate()([z_samples_map, feature_map])
z_f_2 = Concatenate()([z_samples_map, feature_map_shuffle])# 全局判别器
z_in = Input(shape=(z_dim*2,))
z = z_in
z = Dense(z_dim, activation='relu')(z)
z = Dense(z_dim, activation='relu')(z)
z = Dense(z_dim, activation='relu')(z)
z = Dense(1, activation='sigmoid')(z)GlobalDiscriminator = Model(z_in, z)z_z_1_scores = GlobalDiscriminator(z_z_1)
z_z_2_scores = GlobalDiscriminator(z_z_2)global_info_loss = - K.mean(K.log(z_z_1_scores + 1e-6) + K.log(1 - z_z_2_scores + 1e-6))# 局部判别器
z_in = Input(shape=(None, None, z_dim*2))
z = z_in
z = Dense(z_dim, activation='relu')(z)
z = Dense(z_dim, activation='relu')(z)
z = Dense(z_dim, activation='relu')(z)
z = Dense(1, activation='sigmoid')(z)LocalDiscriminator = Model(z_in, z)z_f_1_scores = LocalDiscriminator(z_f_1)
z_f_2_scores = LocalDiscriminator(z_f_2)
local_info_loss = - K.mean(K.log(z_f_1_scores + 1e-6) + K.log(1 - z_f_2_scores + 1e-6))# 用来训练的模型
model_train = Model(x_in, [z_z_1_scores, z_z_2_scores, z_f_1_scores, z_f_2_scores])
model_train.add_loss(alpha * global_info_loss + beta * local_info_loss + gamma * prior_kl_loss)
model_train.compile(optimizer=Adam(1e-3))model_train.fit(x_train, epochs=100, batch_size=100)
model_train.save_weights('total_model.tiny.imagenet.weights')# 输出编码器的特征
zs = encoder.predict(x_train, verbose=True)
zs.mean() # 查看均值(简单观察先验分布有没有达到效果)
zs.std() # 查看方差(简单观察先验分布有没有达到效果)# 随机选一张图片,输出最相近的图片
# 可以选用欧氏距离或者cos值
def sample_knn(path):n = 10topn = 10figure1 = np.zeros((img_dim*n, img_dim*topn, 3))figure2 = np.zeros((img_dim*n, img_dim*topn, 3))zs_ = zs / (zs**2).sum(1, keepdims=True)**0.5for i in range(n):one = np.random.choice(len(x_train))idxs = ((zs**2).sum(1) + (zs[one]**2).sum() - 2 * np.dot(zs, zs[one])).argsort()[:topn]for j,k in enumerate(idxs):digit = x_train[k]figure1[i*img_dim: (i+1)*img_dim,j*img_dim: (j+1)*img_dim] = digitidxs = np.dot(zs_, zs_[one]).argsort()[-n:][::-1]for j,k in enumerate(idxs):digit = x_train[k]figure2[i*img_dim: (i+1)*img_dim,j*img_dim: (j+1)*img_dim] = digitfigure1 = (figure1 + 1) / 2 * 255figure1 = np.clip(figure1, 0, 255)figure2 = (figure2 + 1) / 2 * 255figure2 = np.clip(figure2, 0, 255)imageio.imwrite(path+'_l2.png', figure1)imageio.imwrite(path+'_cos.png', figure2)sample_knn('test')

这篇关于基于互信息最大化的无监督学习图像特征表示------P02114198田园,P02114018刘颖,P02114050刘欣让的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/340067

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

KLayout ------ 旋转物体90度并做平移

KLayout ------ 旋转创建的物体 正文 正文 前段时间,有个小伙伴留言问我,KLayout 中如何旋转自己创建的物体,这里特来说明一下。 import pyapoly = pya.DPolygon([pya.DPoint(0, 0), pya.DPoint(0, 5), pya