深度学习之受限玻尔兹曼机RBM(七)

网上有很多的教程讲玻尔兹曼机和受限玻尔兹曼机,但是很多博客或者网站写的不是很清楚,也可能是我水平有限,反正有一部份我是没看懂。所我我这儿偷个懒,讲一下如何利用sklearn包里的RBM做图像特征提取。参考官方代码: sklearn官方RBM例子

本文介绍的限制玻尔兹曼机对输入的数据有限制,必须是0、1的离散数据。

预备知识: 贝叶斯定理 => 蒙特卡罗马尔科夫(MCMC方法) => 马尔科夫链 => 能量函数(从物理公式由来) => 马尔科夫链采样(Gibbs采样) => CD学习算法 => 限制玻尔兹曼机


下面是参照sklearn的代码,感受了一下什么是受限玻尔兹曼机,看看它到底可以做什么,代码奉上

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import BernoulliRBM

img0 = np.array(Image.open('D:\\pythoncode\\learn1\\lesson1\\zero.jpg').convert('L'))
img1 = np.array(Image.open('D:\\pythoncode\\learn1\\lesson1\\one.jpg').convert('L'))

#标准化数据,只有0和1的值
def normalize_data(data):  # 0.1<=data[i][j]<=0.9
    data = (data - np.mean(data)) / np.std(data)
    rows,cols = data.shape
    for i in range(rows):
      for j in range(cols):
        if (data[i,j] > 0):
          data[i,j] = 1
        else:
          data[i,j] = 0
    return data

img0 = normalize_data(img0)
img1 = normalize_data(img1)

rbm = BernoulliRBM(n_components=20, learning_rate=0.06, batch_size=10, n_iter=50, verbose=True, random_state=0)
rbm.fit(img0)
#得到权值矩阵、隐藏层偏置值和显示层的偏置值
weight = rbm.components_
baise = rbm.intercept_hidden_
baise_vis = rbm.intercept_visible_

#逆向还原输入的图片
hidden_img = np.dot(img0, weight.T) + baise
reverimg = np.dot(hidden_img, weight) + baise_vis
#print(reverimg.shape)

#图片输出显示
ax = plt.subplot(1, 2, 1)
plt.imshow(img0, cmap='gray')
ax = plt.subplot(1, 2, 2)
plt.imshow(reverimg, cmap='gray')
plt.show()

执行上面代码,结果如下,左边是原图,右边是经过限制玻尔兹曼机后的图片:


不知道大家看到这幅图有什么感觉,这不就是autoencoding(自稀疏编码)来进行图像压缩么? 在我的文章里面也用python实现过自稀疏编码的图像压缩,大家可以参考自稀疏编码进行图像压缩

编辑于 2017-10-23 17:31