用cnn时必须用mnist.uint8数据库吗

用cnn时必须用mnist.uint8数据库吗,第1张

首先上搜索引擎,无论是百度还是google,搜“MNIST”第一个出来的肯定是

http://yann.lecun.com/exdb/mnist/ 没错,就是它!这个网页上面有四个压缩包的链接,下载下来吧少年!然后别忙着关掉这个网页,因为后面的读取数据还得依靠这个网页的说明。

下面用其中一个包t10k-images_idx3为例子,写代码说明如何使用这个数据库。

这是从verysource.com上面下载的源码,赞一个!and再赞一个!

% Matlab_Read_t10k-images_idx3.m

% 用于读取MNIST数据集中t10k-images.idx3-ubyte文件并将其转换成bmp格式图片输出。

% 用法:运行程序,会d出选择测试图片数据文件t10k-labels.idx1-ubyte路径的对话框和

% 选择保存测试图片路径的对话框,选择路径后程序自动运行完毕,期间进度条会显示处理进度。

% 图片以TestImage_00001.bmp~TestImage_10000.bmp的格式保存在指定路径,10000个文件占用空间39M。。

% 整个程序运行过程需几分钟时间。

% Written By DXY@HUST IPRAI

% 2009-2-22

clear all

clc

%读取训练图片数据文件

[FileName,PathName] = uigetfile('*.*','选择测试图片数据文件t10k-images.idx3-ubyte')

TrainFile = fullfile(PathName,FileName)

fid = fopen(TrainFile,'r')%fopen()是最核心的函数,导入文件,‘r’代表读入

a = fread(fid,16,'uint8')%这里需要说明的是,包的前十六位是说明信息,从上面提到的那个网页可以看到具体那一位代表什么意义。所以a变量提取出这些信息,并记录下来,方便后面的建立矩阵等动作。

MagicNum = ((a(1)*256+a(2))*256+a(3))*256+a(4)

ImageNum = ((a(5)*256+a(6))*256+a(7))*256+a(8)

ImageRow = ((a(9)*256+a(10))*256+a(11))*256+a(12)

ImageCol = ((a(13)*256+a(14))*256+a(15))*256+a(16)

%从上面提到的网页可以理解这四句

if ((MagicNum~=2051)||(ImageNum~=10000))

error('不是 MNIST t10k-images.idx3-ubyte 文件!')

fclose(fid)

return

end %排除选择错误的文件。

savedirectory = uigetdir('','选择测试图片路径:')

h_w = waitbar(0,'请稍候,处理中>>')

for i=1:ImageNum

b = fread(fid,ImageRow*ImageCol,'uint8') %fread()也是核心的函数之一,b记录下了一副图的数据串。注意这里还是个串,是看不出任何端倪的。

c = reshape(b,[ImageRow ImageCol])%亮点来了,reshape重新构成矩阵,终于把串转化过来了。众所周知图片就是矩阵,这里reshape出来的灰度矩阵就是该手写数字的矩阵了。

d = c'%转置一下,因为c的数字是横着的。。。

e = 255-d%根据灰度理论,0是黑色,255是白色,为了弄成白底黑字就加入了e

e = uint8(e)

savepath = fullfile(savedirectory,['TestImage_' num2str(i,'d') '.bmp'])

imwrite(e,savepath,'bmp')%最后用imwrite写出图片

waitbar(i/ImageNum)

end

fclose(fid)

close(h_w)

在选择好的路径中,就有了一大堆MNIST的手写数字的图片。想弄哪个,就用imread()弄它!

批量输入后,如何使用numpy矩阵计算的方法计算各权值梯度,提高计算速度

 def backprop(self, x, y):  #x为多维矩阵。每列为一个x值。 y为多维矩阵。每列为一个y值。

      batch_num=x.shape[1]

      #print(x.shape)

      #print(y.shape)

   

      """创建两个变量,用来存储所有b值和所有w值对应的梯度值。初始化为0.nabla_b为一个list,形状与biases的形状完全一致。nabla_w 为一个list,形状与weights的形状完全一致。     

      """

      nabla_b = [np.zeros(b.shape) for b in self.biases]

      nabla_w = [np.zeros(w.shape) for w in self.weights]

      # feedforward

      """activations,用来所有中间层和输出层在一次前向计算过程中的最终输出值,即a值。该值记录下来,以供后期使用BP算法求每个b和w的梯度。 

      """   

      activation = x  #x为本批多个x为列组成的矩阵。

      activations = [x] # list to store all the activations, layer by layer

      """zs,用来所有中间层和输出层在一次前向计算过程中的线性输出值,即z值。该值记录下来,以供后期使用BP算法求每个b和w的梯度。 

      """

      zs = [] # list to store all the z vectors, layer by layer ,zs的每个元素为本batch的x对应的z为列构成的矩阵。

      """ 

              通过一次正向计算,将中间层和输出层所有的z值和a值全部计算出来,并存储起来。供接下来求梯度使用。

      """   

      for b, w in zip(self.biases, self.weights):

          #print(w.shape)

          #print(np.dot(w, activation).shape)

          #print(b.shape)

          z = np.dot(w, activation)+b   #z为本batch的x对应的z为列构成的矩阵。

          zs.append(z)

          activation = sigmoid(z)

          activations.append(activation)

      """ 

              以下部分是采用BP算法求解每个可训练参数的计算方法。是权重更新过程中的关键。

      """

      # backward pass

      # 求出输出层的delta值

      delta = ((activations[-1]-y) * sigmoid_prime(zs[-1]))

      nabla_b[-1] = delta.mean(axis=1).reshape(-1, 1)     

      nabla_w[-1] =np.dot(delta,activations[-2].transpose())/batch_num

   

   

      # Note that the variable l in the loop below is used a little

      # differently to the notation in Chapter 2 of the book.  Here,

      # l = 1 means the last layer of neurons, l = 2 is the

      # second-last layer, and so on.  It's a renumbering of the

      # scheme in the book, used here to take advantage of the fact

      # that Python can use negative indices in lists.

      for l in range(2, self.num_layers):

          z = zs[-l]

          sp = sigmoid_prime(z)

          delta = (np.dot(self.weights[-l+1].transpose(), delta) * sp)

          nabla_b[-l] = delta.mean(axis=1).reshape(-1, 1)

          nabla_w[-l] =np.dot(delta,activations[-l-1].transpose())/batch_num

      return (nabla_b, nabla_w)

##梯度计算后,如何更新各权值

  def update_mini_batch(self, mini_batch, eta):

      """Update the network's weights and biases by applying

      gradient descent using backpropagation to a single mini batch.

      The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta``

      is the learning rate."""

      """ 初始化变量,去存储各训练参数的微分和。

      """

      nabla_b = [np.zeros(b.shape) for b in self.biases]

      nabla_w = [np.zeros(w.shape) for w in self.weights]

      """ 循环获取batch中的每个数据,获取各训练参数的微分,相加后获得各训练参数的微分和。

      """

      x_batch=None

      y_batch=None

      for x, y in mini_batch:

          if( x_batch is None):

              x_batch=x

          else:

              x_batch=np.append(x_batch,x,axis=1) 

          if( y_batch is None):

              y_batch=y

          else:

              y_batch=np.append(y_batch,y,axis=1) 

   

   

      delta_nabla_b, delta_nabla_w = self.backprop(x_batch, y_batch)

       

      nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]

      nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]

   

      """ 使用各训练参数的平均微分和与步长的乘积,去更新每个训练参数

      """

      self.weights = [w-eta*nw

                      for w, nw in zip(self.weights, nabla_w)]

      self.biases = [b-eta*nb

                     for b, nb in zip(self.biases, nabla_b)]

1 cifar10数据库

60000张32*32 彩色图片 共10类

50000张训练

10000张测试

下载cifar10数据库

这是binary格式的,所以我们要把它转换成leveldb格式。

2 在../caffe-windows/examples/cifar10文件夹中有一个 convert_cifar_data.cpp

将他include到MainCaller.cpp中。如下:

编译....我是一次就通过了 ,在bin文件夹里出现convert_cifar_data.exe。然后 就可以进行格式转换。binary→leveldb

可以在bin文件夹下新建一个input文件夹。将cifar10.binary文件放在input文件夹中,这样转换时就不用写路径了。

cmd进入bin文件夹

执行后,在output文件夹下有cifar_train_leveldb和cifar_test_leveldb两个文件夹。里面是转化好的leveldb格式数据。

当然,也可以写一�¸.bat文件处理,方便以后再次使用。

3 下面我们要求数据图像的均值

编译../../tools/comput_image_mean.cpp

编译成功后。接下来求mean

cmd进入bin。

执行后,在bin文件夹下出现一个mean.binaryproto文件,这就是所需的均值文件。

4 训练cifar网络

在.../examples/cifar10文件夹里已经有网络的配置文件,我们只需要将cifar_train_leveldb和cifar_test_leveldb两个文件夹还有mean.binaryproto文件拷到cifar0文件夹下。

修改cifar10_quick_train.prototxt中的source: "cifar-train-leveldb" mean_file: "mean.binaryproto" 和cifar10_quick_test.prototxt中的source: "cifar-test-leveldb"

mean_file: "mean.binaryproto"就可以了,

后面再训练就类似于MNIST的训练。写一个train_quick.bat,内容如下:

[plain] view plaincopy

copy ..\\..\\bin\\MainCaller.exe ..\\..\\bin\\train_net.exe

SET GLOG_logtostderr=1

"../../bin/train_net.exe" cifar10_quick_solver.prototxt

pause


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9947029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存