稀疏自编码器和矢量化编程

相关的公式

证明参考PPT: http://wenku.baidu.com/link?url=dBZZq7TYJOnIw2mwilKsJT_swT52I0OoikmvmgBaYE_NvP_KChFZ-HOURH5LMiLEuSVFcGmJ0bQfkG-ZYk-IRJf7D-w6P9PBec8EZ9IxgFS

Python实现代码参考

@author: Paul Rothnieemail : [email protected]https://github.com/siddharth950/Sparse-Autoencoder
  1 # -*- coding: utf-8 -*-
  2 # Refer to https://github.com/siddharth950/Sparse-Autoencoder
  3
  4 import numpy as np
  5 import numpy.linalg as la
  6 import scipy.io
  7 import scipy.optimize
  8 import matplotlib.pyplot
  9 import time
 10 import struct
 11 import array
 12
 13 class sparse_autoencoder(object):  #稀疏自编码类
 14     def __init__(self, visible_size, hidden_size, lambda_, rho, beta):
 15         self.visible_size = visible_size
 16         self.hidden_size = hidden_size
 17         self.lambda_ = lambda_
 18         self.rho = rho
 19         self.beta = beta
 20         w_max = np.sqrt(6.0 / (visible_size + hidden_size + 1.0))
 21         w_min = -w_max
 22         W1 = (w_max - w_min) * np.random.random_sample(size = (hidden_size,
 23                                                         visible_size)) + w_min
 24         W2 = (w_max - w_min) * np.random.random_sample(size = (visible_size,
 25                                                         hidden_size)) + w_min
 26         b1 = np.zeros(hidden_size)
 27         b2 = np.zeros(visible_size)
 28         self.idx_0 = 0
 29         self.idx_1 = hidden_size * visible_size # 64*25
 30         self.idx_2 = self.idx_1 +  hidden_size * visible_size # 25*64
 31         self.idx_3 = self.idx_2 + hidden_size # 64
 32         self.idx_4 = self.idx_3 + visible_size # 25
 33         self.initial_theta = np.concatenate((W1.flatten(), W2.flatten(),
 34                                              b1.flatten(), b2.flatten()))
 35
 36     def sigmoid(self, x):  # sigmoid函数
 37         return 1.0 / (1.0 + np.exp(-x))
 38
 39     def unpack_theta(self, theta):  # 获取传递给scipy.optimize.minimize的theta
 40         W1 = theta[self.idx_0 : self.idx_1]
 41         W1 = np.reshape(W1, (self.hidden_size, self.visible_size))
 42         W2 = theta[self.idx_1 : self.idx_2]
 43         W2 = np.reshape(W2, (self.visible_size, self.hidden_size))
 44         b1 = theta[self.idx_2 : self.idx_3]
 45         b1 = np.reshape(b1, (self.hidden_size, 1))
 46         b2 = theta[self.idx_3 : self.idx_4]
 47         b2 = np.reshape(b2, (self.visible_size, 1))
 48         return W1, W2, b1, b2
 49
 50     def cost(self, theta, visible_input):  # cost函数
 51         W1, W2, b1, b2 = self.unpack_theta(theta)
 52         # layer=f(w*l+b)
 53         hidden_layer = self.sigmoid(np.dot(W1, visible_input) + b1)
 54         output_layer = self.sigmoid(np.dot(W2, hidden_layer) + b2)
 55         m = visible_input.shape[1]
 56         error = -(visible_input - output_layer)
 57         sum_sq_error =  0.5 * np.sum(error * error, axis = 0)
 58         avg_sum_sq_error = np.mean(sum_sq_error)
 59         reg_cost =  self.lambda_ * (np.sum(W1 * W1) + np.sum(W2 * W2)) / 2.0  # L2正则化
 60         rho_bar = np.mean(hidden_layer, axis=1) # 平均激活程度
 61         KL_div = np.sum(self.rho * np.log(self.rho / rho_bar) +
 62                         (1 - self.rho) * np.log((1-self.rho) / (1- rho_bar)))   # 相对熵
 63         cost = avg_sum_sq_error + reg_cost + self.beta * KL_div  # 损失函数
 64         KL_div_grad = self.beta * (- self.rho / rho_bar + (1 - self.rho) /
 65                                     (1 - rho_bar))
 66         del_3 = error * output_layer * (1.0 - output_layer)
 67         del_2 = np.transpose(W2).dot(del_3) + KL_div_grad[:, np.newaxis]
 68
 69         del_2 *= hidden_layer * (1 - hidden_layer)  # *=残差项
 70         W1_grad = del_2.dot(visible_input.transpose()) / m  # delt_w=del*(l.T)
 71         W2_grad = del_3.dot(hidden_layer.transpose()) / m
 72         b1_grad = del_2   # delt_b=del
 73         b2_grad = del_3
 74         W1_grad += self.lambda_ * W1
 75         W2_grad += self.lambda_ * W2
 76         b1_grad = b1_grad.mean(axis = 1)
 77         b2_grad = b2_grad.mean(axis = 1)
 78         theta_grad = np.concatenate((W1_grad.flatten(), W2_grad.flatten(),
 79                                      b1_grad.flatten(), b2_grad.flatten()))
 80         return [cost, theta_grad]
 81
 82     def train(self, data, max_iterations):  # 训练令cost最小
 83         opt_soln = scipy.optimize.minimize(self.cost,
 84                                            self.initial_theta,
 85                                            args = (data,), method = ‘L-BFGS-B‘,
 86                                            jac = True, options =
 87                                            {‘maxiter‘:max_iterations} )
 88         opt_theta = opt_soln.x
 89         return opt_theta
 90
 91
 92 def normalize_data(data):  # 0.1<=data[i][j]<=0.9
 93     data = data - np.mean(data)
 94     pstd = 3 * np.std(data)
 95     data = np.maximum(np.minimum(data, pstd), -pstd) / pstd
 96     data = (data + 1.0) * 0.4 + 0.1
 97     return data
 98
 99 def loadMNISTImages(file_name):  # 获取mnist数据
100     image_file = open(file_name, ‘rb‘)
101     head1 = image_file.read(4)
102     head2 = image_file.read(4)
103     head3 = image_file.read(4)
104     head4 = image_file.read(4)
105     num_examples = struct.unpack(‘>I‘, head2)[0]
106     num_rows     = struct.unpack(‘>I‘, head3)[0]
107     num_cols     = struct.unpack(‘>I‘, head4)[0]
108     dataset = np.zeros((num_rows*num_cols, num_examples))
109     images_raw  = array.array(‘B‘, image_file.read())
110     image_file.close()
111     for i in range(num_examples):
112         limit1 = num_rows * num_cols * i
113         limit2 = num_rows * num_cols * (i + 1)
114         dataset[:, i] = images_raw[limit1: limit2]
115     return dataset / 255
116
117
118 def load_data(num_patches, patch_side):  # 随机选取num_patches个数据
119     images = scipy.io.loadmat(‘IMAGES.mat‘)  # 515*512*10
120     images = images[‘IMAGES‘]
121     patches = np.zeros((patch_side * patch_side, num_patches))
122     seed = 1234
123     rand = np.random.RandomState(seed)
124     image_index = rand.random_integers( 0, 512 - patch_side, size =
125                                         (num_patches, 2))
126     image_number = rand.random_integers(0, 10 - 1, size = num_patches)
127     for i in xrange(num_patches):
128         idx_1 = image_index[i, 0]
129         idx_2 = image_index[i, 1]
130         idx_3 = image_number[i]
131         patch = images[idx_1:idx_1 + patch_side, idx_2:idx_2 + patch_side,
132                        idx_3]
133         patch = patch.flatten()
134         patches[:,i] = patch
135     patches = normalize_data(patches)
136     return patches
137
138 def visualizeW1(opt_W1, vis_patch_side, hid_patch_side):  # 可视化
139     figure, axes = matplotlib.pyplot.subplots(nrows = hid_patch_side,
140                                               ncols = hid_patch_side)
141     index = 0
142     for axis in axes.flat:
143         axis.imshow(opt_W1[index, :].reshape(vis_patch_side,
144                             vis_patch_side), cmap = matplotlib.pyplot.cm.gray,
145                             interpolation = ‘nearest‘)
146         axis.set_frame_on(False)
147         axis.set_axis_off()
148         index += 1
149     matplotlib.pyplot.show()
150
151 def run_sparse_ae(): # 稀疏自编码器
152     beta = 3.0
153     lamda = 0.0001
154     rho = 0.01
155     visible_side = 8
156     hidden_side = 5
157     visible_size = visible_side * visible_side
158     hidden_size = hidden_side * hidden_side
159     m = 10000
160     max_iterations = 400
161     training_data = load_data(num_patches = m, patch_side = visible_side)
162     sae = sparse_autoencoder(visible_size, hidden_size, lamda, rho, beta)
163     opt_theta = sae.train(training_data, max_iterations)
164     opt_W1 = opt_theta[0 : visible_size * hidden_size].reshape(hidden_size,
165                                                                visible_size)
166     visualizeW1(opt_W1,visible_side, hidden_side)
167
168 def run_sparse_ae_MNIST():  # 矢量化MNIST
169     beta = 3.0
170     lamda = 3e-3
171     rho = 0.1
172     visible_side = 28
173     hidden_side = 14
174     visible_size = visible_side * visible_side
175     hidden_size = hidden_side * hidden_side
176     m = 10000
177     max_iterations = 400
178     training_data = loadMNISTImages(‘train-images.idx3-ubyte‘)
179     training_data = training_data[:, 0:m]
180     sae = sparse_autoencoder(visible_size, hidden_size, lamda, rho, beta)
181     opt_theta = sae.train(training_data, max_iterations)
182     opt_W1 = opt_theta[0 : visible_size * hidden_size].reshape(hidden_size,
183                                                                visible_size)
184     visualizeW1(opt_W1, visible_side, hidden_side)
185
186 if __name__ == "__main__":
187     run_sparse_ae()
188     #run_sparse_ae_MNIST()

				
时间: 2024-10-27 10:29:27

稀疏自编码器和矢量化编程的相关文章

UFLDL教程练习答案一(稀疏自编码器和矢量化编程实现)

最近想研究下深度学习,一开始就看UFLDL(unsuprisedfeature learning and deep learning)教程了,特将课后习题答案放在这里,作为一个笔记. 笔记: 1:自编码算法是一个无监督学习算法,它通过学习hw,b(x) = x,因此最后的outputlayer单元数与inputlayer单元数量相等,而中间的hiddenlayer可以很大,这是加个稀疏惩罚项,就相当于使中间很多结点的激励值为0,这样就是类似于PCA了. 2:可视化自编码器,习题中可视化的是W1,

矢量化编程的简单记录

基于矩阵的算法都是针对向量的,这里也成为矢量.为了简化程序的逻辑,需要一种新的编程方法,处理基于矩阵的基本运算,这就是所谓的矢量化编程. 1 最早出现的矢量化编程语言是 MATLAB脚本语言,它极大地降低了数学领域程序设计的复杂度.因为大量的人工智能算法最早都是用MATLAB语言编写的. 2 python自带的list结构,提供的切片功能可以部分实现矢量化编程.其扩展包Numpy提供了专门的矩阵数据结构和线性代数库,完全实现了矢量化编程. 矢量化的一个重要特点是可以直接将数学公式转换为相应的程序

矢量化编程——以MNIST为例

矢量化编程就是用矢量运算取代所有的显式for循环. 上一节所用的是512*512*10的数据集很小,我们取的patch很小(8*8),学来的特征很少(25),而我又注释掉了梯度校验(偷懒),所以程序用了1分钟就跑完了(i5处理器). 但实际上我们遇到的问题规模比这个打太多了,稍微大一点的数据集比如说MNIST,这个数据库是另外一个更大的手写体数据库NIST的子集,包含60000个训练例子和10000测试样本,所有的图片都经过了尺寸标准化和中心化,图片的大小固定(28*28). 输入 images

UFLDL接听教程练习(来自编码器和矢量编程疏)

最近想在深入学习研究,开始看UFLDL(unsuprisedfeature learning and deep learning)教程了.特将课后习题答案放在这里,作为一个笔记. 笔记: 1:自编码算法是一个无监督学习算法.它通过学习hw,b(x) = x,因此最后的outputlayer单元数与inputlayer单元数量相等,而中间的hiddenlayer能够非常大.这是加个稀疏惩处项,就相当于使中间非常多结点的激励值为0.这样就是类似于PCA了.算法就是反向传播,这里不做介绍.能够看教程!

稀疏自编码器及事实上现——怎样搞基

自编码器是什么? 自编码器本身就是一种BP神经网络. 它是一种无监督学习算法. 我们都知道神经网络能够从随意精度逼近随意函数,这里我们让神经网络目标值等于输出值x,也就是模拟一个恒等函数: 太无聊了,是吗?输入等于输出,这网络有什么意义?可是.当我们把自编码神经网络增加某些限制,事情就发生了变化. 如图1所看到的,这就是一个主要的自编码神经网络.能够看到隐含层节点数量要少于输入层节点数量. 图1 举个样例,假设我们输入一张10*10的图像,这样就有100个像素,所以输入层和输出层的节点数量就是1

稀疏自编码器及其实现——如何搞基

自编码器是什么? 自编码器本身就是一种BP神经网络.它是一种无监督学习算法. 我们都知道神经网络可以从任意精度逼近任意函数,这里我们让神经网络目标值等于输出值x,也就是模拟一个恒等函数: 太无聊了,是吗?输入等于输出,这网络有什么意义?但是,当我们把自编码神经网络加入某些限制,事情就发生了变化.如图1所示,这就是一个基本的自编码神经网络,可以看到隐含层节点数量要少于输入层节点数量. 图1 举个例子,如果我们输入一张10*10的图像,这样就有100个像素,所以输入层和输出层的节点数量就是100.而

从xfire谈WebService接口化编程

前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总结一下自己对于接口化开发的认识,以及如何利用java开发一些可以供其他应用程序使用的web服务. 其实最开始对Web服务的认识还是在课堂上,老师反复地在讲SOAP协议,其实也不懂究竟是什么意思,无缘无故就在大脑中形成了条件反射,SOAP协议的中文意思就是简单对象访问协议:而且,更加巧合的是自己在求职面试时就被

深度学习UFLDL老教程笔记1 稀疏自编码器Ⅱ

稀疏自编码器的学习结构: 稀疏自编码器Ⅰ: 神经网络 反向传导算法 梯度检验与高级优化 稀疏自编码器Ⅱ: 自编码算法与稀疏性 可视化自编码器训练结果 Exercise: Sparse Autoencoder 自编码算法与稀疏性 已经讨论了神经网络在有监督学习中的应用,其中训练样本是有类别标签的(x_i,y_i). 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值x_i = y_i . 下图是一个自编码神经网络的示例. 一次autoencoder学习,结构三层:输入层

是时候开始引入异常化编程了!

laravel-validation 异常化表单验证 合理的利用异常化编程方法,可以使代码可维护性大幅提高. 使用前的准备 在 composer.json 文件中申明依赖: "five-say/laravel-validation": "1.*" 在 /app/config/app.php 中设置"别名" 'aliases' => array( ... 'Validation' => 'FiveSay\LaravelValidatio