博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】Torch7 教程 Supervised Learning CNN
阅读量:6099 次
发布时间:2019-06-20

本文共 5705 字,大约阅读时间需要 19 分钟。

Torch7 教程 Supervised Learning CNN              

分类:                          

全部代码放在:https://github.com/guoyilin/CNN_Torch7

在搭建好Torch7之后,我们开始进行监督式Supervised Learning for CNN, Torch7提供了代码和一些说明文件:

http://code.madbits.com/wiki/doku.php?id=tutorial_supervised_1_data 和http://torch.cogbits.com/doc/tutorials_supervised/说的比较详细。

结合http://ufldl.stanford.edu/wiki/index.php/Feature_extraction_using_convolution了解CNN的做法,最关键的是要熟悉http://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm 算法的主要做法。bp算法的目的是为了一次性计算所有的参数导数,该算法利用了chain rule进行error的后向传播。这篇文章写了bp算法: http://neuralnetworksanddeeplearning.com/chap2.html,  写的比较详细。

如果背景不熟悉,可以看看Linear Classification, Neutral Network, SGD算法。

由于该教程使用了torch自己的数据格式,因此如果你要使用自己的数据,需要预先转换下。这里我训练的是图像分类,因此可以使用

https://github.com/clementfarabet/graphicsmagick 进行数据的加载。
如下是加载图像的代码:
[plain]
  1. height = 200  
  2. width = 200  
  3. --see if the file exists  
  4. function file_exists(file)  
  5.   local f = io.open(file, "rb")  
  6.   if f then f:close() end  
  7.   return f ~= nil  
  8. end  
  9.   
  10. function read_file (file)  
  11.   if not file_exists(file) then return {} end  
  12.   lines = {}  
  13.   for line in io.lines(file) do  
  14.     lines[#lines + 1] = line  
  15.   end  
  16.   return lines  
  17. end  
  18.   
  19. -- read all label name. hash them to id.  
  20. labels_id = {}  
  21. label_lines = read_file('labels.txt')  
  22. for i = 1, #label_lines do  
  23.   labels_id[label_lines[i]] = i  
  24. end  
  25.   
  26. -- read train data. iterate train.txt  
  27.   
  28. local train_lines = read_file("train.txt")  
  29. local train_features = torch.Tensor(#train_lines, 3, height, width) -- dimension: sample number, YUV, height, width  
  30. local train_labels = torch.Tensor(#train_lines) -- dimension: sample number  
  31.   
  32. for i = 1, #train_lines do  
  33.   local image = gm.Image("/train_images/" .. train_lines[i])  
  34.   image:size(width, height)  
  35.   img_yuv = image:toTensor('float', 'YUV', 'DHW')  
  36.   --print(img_yuv:size())  
  37.   --print(img_yuv:size())  
  38.   train_features[i] = img_yuv  
  39.   local label_name = train_lines[i]:match("([^,]+)/([^,]+)")  
  40.   train_labels[i] = labels_id[label_name]  
  41.   --print(train_labels[i])  
  42.   if(i % 100 == 0) then  
  43.     print("train data: " .. i)  
  44.   end  
  45. end  
  46.   
  47. trainData = {  
  48.   data = train_features:transpose(3,4),  
  49.   labels = train_labels,  
  50.   --size = function() return #train_lines end  
  51.   size = function() return #train_lines end  
  52. }  
  53.   
  54. -- read test data. iterate test.txt  
  55. local test_lines = read_file("test.txt")  
  56.   
  57. local test_features = torch.Tensor(#test_lines, 3, height, width) -- dimension: sample number, YUV, height, width  
  58. local test_labels = torch.Tensor(#test_lines) -- dimension: sample number  
  59.   
  60. for i = 1, #test_lines do  
  61.   -- if image size is zero, gm.Imge may throw error, we need to dispose it later.  
  62.   local image = gm.Image("test_images/" .. test_lines[i])  
  63.   --print(test_lines[i])  
  64.   
  65.   image:size(width, height)  
  66.   local img_yuv = image:toTensor('float', 'YUV', 'DHW')  
  67.   --print(img_yuv:size())  
  68.   test_features[i] = img_yuv  
  69.   local label_name = test_lines[i]:match("([^,]+)/([^,]+)")  
  70.   test_labels[i] = labels_id[label_name]  
  71.   --print(test_labels[i])  
  72.   if(i % 100 == 0) then  
  73.     print("test data: " .. i)  
  74.   end  
  75. end  
  76.   
  77. testData = {  
  78.   data = test_features:transpose(3,4),  
  79.   labels = test_labels,  
  80.   --size = function() return #test_lines end  
  81.   size = function() return #test_lines end  
  82. }  
  83. trsize = #train_lines  
  84. tesize = #test_lines  
height = 200width = 200--see if the file existsfunction file_exists(file)  local f = io.open(file, "rb")  if f then f:close() end  return f ~= nilendfunction read_file (file)  if not file_exists(file) then return {} end  lines = {}  for line in io.lines(file) do    lines[#lines + 1] = line  end  return linesend-- read all label name. hash them to id.labels_id = {}label_lines = read_file('labels.txt')for i = 1, #label_lines do  labels_id[label_lines[i]] = iend-- read train data. iterate train.txtlocal train_lines = read_file("train.txt")local train_features = torch.Tensor(#train_lines, 3, height, width) -- dimension: sample number, YUV, height, widthlocal train_labels = torch.Tensor(#train_lines) -- dimension: sample numberfor i = 1, #train_lines do  local image = gm.Image("/train_images/" .. train_lines[i])  image:size(width, height)  img_yuv = image:toTensor('float', 'YUV', 'DHW')  --print(img_yuv:size())  --print(img_yuv:size())  train_features[i] = img_yuv  local label_name = train_lines[i]:match("([^,]+)/([^,]+)")  train_labels[i] = labels_id[label_name]  --print(train_labels[i])  if(i % 100 == 0) then    print("train data: " .. i)  endendtrainData = {  data = train_features:transpose(3,4),  labels = train_labels,  --size = function() return #train_lines end  size = function() return #train_lines end}-- read test data. iterate test.txtlocal test_lines = read_file("test.txt")local test_features = torch.Tensor(#test_lines, 3, height, width) -- dimension: sample number, YUV, height, widthlocal test_labels = torch.Tensor(#test_lines) -- dimension: sample numberfor i = 1, #test_lines do  -- if image size is zero, gm.Imge may throw error, we need to dispose it later.  local image = gm.Image("test_images/" .. test_lines[i])  --print(test_lines[i])  image:size(width, height)  local img_yuv = image:toTensor('float', 'YUV', 'DHW')  --print(img_yuv:size())  test_features[i] = img_yuv  local label_name = test_lines[i]:match("([^,]+)/([^,]+)")  test_labels[i] = labels_id[label_name]  --print(test_labels[i])  if(i % 100 == 0) then    print("test data: " .. i)  endendtestData = {  data = test_features:transpose(3,4),  labels = test_labels,  --size = function() return #test_lines end  size = function() return #test_lines end}trsize = #train_linestesize = #test_lines
由于图像的大小从32*32变成了200*200, 因此需要修改相应的model中的每一层的大小。
假定其他层没有变化,最后一层需要修改:
[plain]
  1. -- stage 3 : standard 2-layer neural network  
  2.  model:add(nn.Reshape(nstates[2]*47*47))  
  3.  model:add(nn.Linear(nstates[2]*47*47, nstates[3]))  
  4.  model:add(nn.Tanh())  
  5.  model:add(nn.Linear(nstates[3], noutputs))  

转载于:https://www.cnblogs.com/daleloogn/p/4333420.html

你可能感兴趣的文章
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
USB2.0学习笔记连载(十八):keil实现寄存器的配置及相关函数讲解(二)
查看>>
SqlServer表名称定义
查看>>
jquery操作select(取值,设置选中)
查看>>
浅谈无线h5开发
查看>>
关于裸婚,没事F5刷豆瓣是不够的!
查看>>
【FJOI2015】金币换位问题
查看>>
HighChar
查看>>
window上安装pymysql
查看>>
控件调用函数
查看>>
activity的启动模式
查看>>
Android主线程、子线程通信(Thread+handler)
查看>>
gitlab配置邮箱
查看>>
Win10桌面奔溃怎么办?雨林木风Win10奔溃解决方法教程
查看>>
mysql Inoodb 内核
查看>>
Redis 基础
查看>>
UITextField的returnkey点击事件
查看>>
特殊字体引用
查看>>