<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.swarma.org/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88%B7kaggle_mnist%E6%8E%92%E8%A1%8C%E6%A6%9C</id>
	<title>利用python的theano库刷kaggle mnist排行榜 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.swarma.org/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88%B7kaggle_mnist%E6%8E%92%E8%A1%8C%E6%A6%9C"/>
	<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88%B7kaggle_mnist%E6%8E%92%E8%A1%8C%E6%A6%9C&amp;action=history"/>
	<updated>2026-11-03T05:43:58Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88%B7kaggle_mnist%E6%8E%92%E8%A1%8C%E6%A6%9C&amp;diff=34742&amp;oldid=prev</id>
		<title>2024年5月21日 (二) 07:36 18810648466</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88%B7kaggle_mnist%E6%8E%92%E8%A1%8C%E6%A6%9C&amp;diff=34742&amp;oldid=prev"/>
		<updated>2024-05-21T07:36:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2024年5月21日 (二) 07:36的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l266&quot; &gt;第266行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第266行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:python]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:python]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:旧词条迁移]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:旧词条迁移]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:待确定]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>18810648466</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88%B7kaggle_mnist%E6%8E%92%E8%A1%8C%E6%A6%9C&amp;diff=15162&amp;oldid=prev</id>
		<title>Thingamabob：创建页面，内容为“==背景== theano 是一个python语言的库，实现了一些机器学习的方法，最大的特点是可以就像普通的python程序一样透明的使用GPU  t…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88%B7kaggle_mnist%E6%8E%92%E8%A1%8C%E6%A6%9C&amp;diff=15162&amp;oldid=prev"/>
		<updated>2020-10-14T13:50:09Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“==背景== theano 是一个python语言的库，实现了一些机器学习的方法，最大的特点是可以就像普通的python程序一样透明的使用GPU  t…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==背景==&lt;br /&gt;
theano 是一个python语言的库，实现了一些机器学习的方法，最大的特点是可以就像普通的python程序一样透明的使用GPU&lt;br /&gt;
 theano的主页：http://deeplearning.net/software/theano/index.html&lt;br /&gt;
theano 同时也支持符号计算，并且和numpy相容，numpy是一个python的矩阵计算的库，可以让python具备matlab的计算能力，虽然没有matlab方便&lt;br /&gt;
 numpy的主页：http://www.numpy.org/&lt;br /&gt;
MNIST是一个手写数字识别的公开数据集，我以为地球人都知道&lt;br /&gt;
&lt;br /&gt;
http://kaggle2.blob.core.windows.net/competitions/kaggle/3004/logos/front_page.png&lt;br /&gt;
 mnist主页：http://yann.lecun.com/exdb/mnist/&lt;br /&gt;
&lt;br /&gt;
其他大部分资源位于deeplearning向导的主页：&lt;br /&gt;
 deeplearning.net向导: http://deeplearning.net/tutorial/&lt;br /&gt;
&lt;br /&gt;
kaggle是一个供大家公开测试各种机器学习算法的平台，包括ICML和KDD cup一类的比赛都在上面进行，其中的入门测试集就是MNIST：&lt;br /&gt;
 kaggle的MNIST主页：http://www.kaggle.com/c/digit-recognizer&lt;br /&gt;
&lt;br /&gt;
目前发表的最好结果是卷积神经网络方法的0.23%错误率&amp;lt;ref name=&amp;quot;mnist homepage&amp;quot;&amp;gt;http://yann.lecun.com/exdb/mnist/, mnist homepage&lt;br /&gt;
&amp;lt;/ref&amp;gt;，kaggle上被认可的最好结果是0.5%。看这个架势，mnist已经基本被大家解决了。不过本着实践出真知和学习threano用法的目的，我觉得用python的theano库对kaggle mnist刷个榜玩玩也不错。&lt;br /&gt;
&lt;br /&gt;
==数据转换与代码修改==&lt;br /&gt;
theano的代码位于: &lt;br /&gt;
 https://github.com/lisa-lab/DeepLearningTutorials&lt;br /&gt;
我修改后的代码位于：&lt;br /&gt;
 https://github.com/chaosconst/DeepLearningTutorials&lt;br /&gt;
&lt;br /&gt;
===输入数据修改===&lt;br /&gt;
原来是从cPickle导入：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    #############&lt;br /&gt;
    # LOAD DATA #&lt;br /&gt;
    #############&lt;br /&gt;
&lt;br /&gt;
    # Download the MNIST dataset if it is not present&lt;br /&gt;
    data_dir, data_file = os.path.split(dataset)&lt;br /&gt;
    if (not os.path.isfile(dataset)) and data_file == 'mnist.pkl.gz':&lt;br /&gt;
        import urllib&lt;br /&gt;
        origin = 'http://www.iro.umontreal.ca/~lisa/deep/data/mnist/mnist.pkl.gz'&lt;br /&gt;
        print 'Downloading data from %s' % origin&lt;br /&gt;
        urllib.urlretrieve(origin, dataset)&lt;br /&gt;
&lt;br /&gt;
    print '... loading data'&lt;br /&gt;
&lt;br /&gt;
    # Load the dataset&lt;br /&gt;
    f = gzip.open(dataset, 'rb')&lt;br /&gt;
    train_set, valid_set, test_set = cPickle.load(f)&lt;br /&gt;
    f.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更改为读取train.csv和test.csv，先初始化四个list。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    print '... loading data'&lt;br /&gt;
    train_set=list();&lt;br /&gt;
    valid_set=list();&lt;br /&gt;
    test_set=list();&lt;br /&gt;
    predict_set=list();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
valid_set是用来在SGD迭代过程中，用来验证效果但不参与训练的数据集。每次只有确定在valid_set上更有效，才继续进行目标函数的优化，这样可以防止过拟合。参见early-stopping&amp;lt;ref&amp;gt;http://deeplearning.net/tutorial/gettingstarted.html#early-stopping&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
设定数据集的大小，如果是调试模式则减小数据集。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    train_set_size = 36000;&lt;br /&gt;
    valid_set_size = 5000;&lt;br /&gt;
    test_set_size = 1000;&lt;br /&gt;
    predict_set_size = 28000;&lt;br /&gt;
&lt;br /&gt;
    debug = &amp;quot;false&amp;quot;;&lt;br /&gt;
    if debug == &amp;quot;true&amp;quot;:&lt;br /&gt;
      train_set_size = 3600;&lt;br /&gt;
      valid_set_size = 500;&lt;br /&gt;
      test_set_size = 100;&lt;br /&gt;
      predict_set_size = 2800;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
MNIST共有7w条记录，其中6w是训练集，1w是测试集。theano的样例程序就是这么做的，但kaggle把7w的数据分成了两部分，train.csv一共42000行，test.csv一共28000行。实际可用来训练的数据只有42000行（由此估计最后的效果也会有相应的折扣）。theano把6w的训练集分为了5w的test_set和1w的valid_set，我在这里把42000行数据分为36000的train_set、5000行的valid_set和1000行的test_set（训练时用不到）。&lt;br /&gt;
&lt;br /&gt;
另外我建了一个predict_set，用来保存准备提交给kaggle的数据。然后我进行了变量初始化并从文件读取数值，读取的时候把kaggle的int转化成了theano需要的float。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    train_set.append(numpy.ndarray(shape=(train_set_size,28*28), dtype=theano.config.floatX));&lt;br /&gt;
    train_set.append(numpy.ndarray(shape=(train_set_size), dtype=int));&lt;br /&gt;
    valid_set.append(numpy.ndarray(shape=(valid_set_size,28*28), dtype=theano.config.floatX));&lt;br /&gt;
    valid_set.append(numpy.ndarray(shape=(valid_set_size), dtype=int));&lt;br /&gt;
    test_set.append(numpy.ndarray(shape=(test_set_size,28*28), dtype=theano.config.floatX));&lt;br /&gt;
    test_set.append(numpy.ndarray(shape=(test_set_size), dtype=int));&lt;br /&gt;
    predict_set.append(numpy.ndarray(shape=(predict_set_size,28*28), dtype=theano.config.floatX));&lt;br /&gt;
    predict_set.append(numpy.ndarray(shape=(predict_set_size), dtype=int));&lt;br /&gt;
&lt;br /&gt;
    #load data from kaggle test set&lt;br /&gt;
    with open('train.csv', 'rb') as csvfile:&lt;br /&gt;
      datareader = csv.reader(csvfile, delimiter=',')&lt;br /&gt;
      index=0;&lt;br /&gt;
      for row in datareader:&lt;br /&gt;
        if index&amp;lt;train_set_size : &lt;br /&gt;
          train_set[1][index] = string.atoi(row[0]);&lt;br /&gt;
          for pixel_index in xrange(1,28*28+1) : &lt;br /&gt;
            train_set[0][index][pixel_index-1] = string.atof(row[pixel_index])/255;&lt;br /&gt;
        elif index &amp;lt; train_set_size + valid_set_size :&lt;br /&gt;
          valid_set[1][index-train_set_size] = string.atoi(row[0]);&lt;br /&gt;
          for pixel_index in xrange(1,28*28+1) : &lt;br /&gt;
            valid_set[0][index-train_set_size][pixel_index-1] = string.atof(row[pixel_index])/255;&lt;br /&gt;
        else :&lt;br /&gt;
          test_set[1][index-train_set_size-valid_set_size] = string.atoi(row[0]);&lt;br /&gt;
          for pixel_index in xrange(1,28*28+1) : &lt;br /&gt;
            test_set[0][index-train_set_size-valid_set_size][pixel_index-1] = string.atof(row[pixel_index])/255;&lt;br /&gt;
        index+=1;&lt;br /&gt;
        if index == train_set_size + valid_set_size + test_set_size : &lt;br /&gt;
          break; &lt;br /&gt;
    &lt;br /&gt;
    print '... loading predict dataset'&lt;br /&gt;
    #load data from kaggle test set&lt;br /&gt;
    with open('test.csv', 'rb') as csvfile:&lt;br /&gt;
      datareader = csv.reader(csvfile, delimiter=',')&lt;br /&gt;
      index=0;&lt;br /&gt;
      for row in datareader:&lt;br /&gt;
        for pixel_index in xrange(0,28*28) : &lt;br /&gt;
          predict_set[0][index][pixel_index] = string.atof(row[pixel_index])/255;&lt;br /&gt;
        index+=1;&lt;br /&gt;
        if index == predict_set_size: &lt;br /&gt;
          break;&lt;br /&gt;
&lt;br /&gt;
    train_set = tuple(train_set);&lt;br /&gt;
    valid_set = tuple(valid_set);&lt;br /&gt;
    test_set = tuple(test_set);&lt;br /&gt;
    predict_set = tuple(predict_set);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===输出数据修改===&lt;br /&gt;
theano的convnet是由两个卷积层，一个hidden layer和一个logistic regression构成的，如图&amp;lt;ref&amp;gt;http://deeplearning.net/tutorial/lenet.html&amp;lt;/ref&amp;gt;：&lt;br /&gt;
http://deeplearning.net/tutorial/_images/mylenet.png&lt;br /&gt;
&lt;br /&gt;
我们需要的是最后一层的输出，theano的样例程序在最后一层lr给了我们一个符号变量y_pred，定义如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        # initialize with 0 the weights W as a matrix of shape (n_in, n_out)&lt;br /&gt;
        self.W = theano.shared(value=numpy.zeros((n_in, n_out),&lt;br /&gt;
                                                 dtype=theano.config.floatX),&lt;br /&gt;
                                name='W', borrow=True)&lt;br /&gt;
        # initialize the baises b as a vector of n_out 0s&lt;br /&gt;
        self.b = theano.shared(value=numpy.zeros((n_out,),&lt;br /&gt;
                                                 dtype=theano.config.floatX),&lt;br /&gt;
                               name='b', borrow=True)&lt;br /&gt;
&lt;br /&gt;
        # compute vector of class-membership probabilities in symbolic form&lt;br /&gt;
        self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)&lt;br /&gt;
&lt;br /&gt;
        # compute prediction as class whose probability is maximal in&lt;br /&gt;
        # symbolic form&lt;br /&gt;
        self.y_pred = T.argmax(self.p_y_given_x, axis=1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
手册上说可以使用eval()对其进行实例化&amp;lt;ref&amp;gt;http://deeplearning.net/software/theano/tutorial/adding.html#adding-two-scalars&amp;lt;/ref&amp;gt;：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        predict_results = layer3.y_pred.eval({input:predict_set_x});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
但是我这样做不行，只好用了很不理想的方案，原谅我&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    predict_model = theano.function([index], layer3.predict(),&lt;br /&gt;
             givens={&lt;br /&gt;
                x: predict_set_x[index * batch_size: (index + 1) * batch_size]})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
其中predict函数为：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def predict(self):&lt;br /&gt;
        return T.mul(self.y_pred,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
我对技术不敬畏，对不起各位了。&lt;br /&gt;
&lt;br /&gt;
这样我们就得到可以操作的数组，写入输出文件：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
                    predict_res_array = [predict_model(i) for i in xrange(n_predict_batches)]&lt;br /&gt;
                    print predict_res_array;&lt;br /&gt;
                    f = open(&amp;quot;predict_res&amp;quot;,&amp;quot;w+&amp;quot;);&lt;br /&gt;
                    for y_pred_item_array in predict_res_array:&lt;br /&gt;
                      for y_pred_item in y_pred_item_array:&lt;br /&gt;
                        f.write(str(y_pred_item)+'\n');&lt;br /&gt;
                    f.close();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===平移数据===&lt;br /&gt;
以上可以差不多达到1.0%的误差，和理论值0.5%还有差距，我觉得可能是因为数据不够多，所以我对输入输出数据进行了平移预处理。&lt;br /&gt;
输入数据平移：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
awk -F , '{&lt;br /&gt;
&lt;br /&gt;
for (shiftx=-1;shiftx&amp;lt;=1;shiftx++) {&lt;br /&gt;
  for (shifty=-1;shifty&amp;lt;=1;shifty++) {&lt;br /&gt;
&lt;br /&gt;
    printf $1&amp;quot;,&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
    for (y=0;y&amp;lt;28;y++) {&lt;br /&gt;
      for (x=1;x&amp;lt;=28;x++) {&lt;br /&gt;
        x_shift = x + shiftx;&lt;br /&gt;
        y_shift = y + shifty;&lt;br /&gt;
        if ((x_shift&amp;lt;1) || (x_shift&amp;gt;28) || (y_shift&amp;lt;0) || (y_shift&amp;gt;=28)) {&lt;br /&gt;
          printf &amp;quot;0,&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
        i=y_shift*28+x_shift+1;&lt;br /&gt;
        printf $i&amp;quot;,&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
//g' | sed 's/,$//g'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出的时候让平移后的9个位置进行投票，boost了一把&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
awk '{&lt;br /&gt;
  dist[$0]++; &lt;br /&gt;
  if (NR%9==0) {&lt;br /&gt;
    best=1;&lt;br /&gt;
    for (x in dist) {&lt;br /&gt;
      if (dist[x]&amp;gt;dist[best]) best=x&lt;br /&gt;
    } &lt;br /&gt;
    printf best&amp;quot;\n&amp;quot;&lt;br /&gt;
    delete dist;&lt;br /&gt;
  }&lt;br /&gt;
}'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ok，万事俱备，刷榜吧！&lt;br /&gt;
&lt;br /&gt;
==运行结果==&lt;br /&gt;
[http://www.kaggle.com/c/digit-recognizer/leaderboard kaggle传送门]&lt;br /&gt;
 valid_set_error=0.90 test_set_error=0.68&lt;br /&gt;
[[File:kaggle_mnist_rank1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:kaggle_mnist_rank2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
刷到前10，我感觉可以了，再往上刷10名就要被怀疑作弊了。&lt;br /&gt;
&lt;br /&gt;
==不明觉厉==&lt;br /&gt;
simple cell到complex cell是怎么实现的？&lt;br /&gt;
# 拿着某一斜率的filter去扫一遍全局的图像&lt;br /&gt;
# 把图像分割成nxn份,做pooling（可以是max pooling）&lt;br /&gt;
两个二维向量卷积的意思就是扫一遍，类似于你在暗处拿着一个手电筒把一篇文章看一遍。扫的每一帧的具体操作就是相乘（找相似的特征，仅仅是相乘就可以了）。卷积不是目的，扫一遍算相似度才是。&lt;br /&gt;
&lt;br /&gt;
当做polling的时候，时空信息就消失了，本来是28x28维的空间，如果4x4方块做pooling，就只剩下7x7的位置信息了。取而代之的，是feature域的信息。典型的“时空样本变换”，不过这个是98年就做出来的，实在是很赞。&lt;br /&gt;
&lt;br /&gt;
学习方案是构造一个损失函数，然后用SGD求解，因为有很多层，所以损失函数的梯度计算超级复杂，参数也很多很多，不过theano有一个库，可以自动计算梯度。先进行符号计算，然后Sample一些输入数据算梯度。&lt;br /&gt;
&lt;br /&gt;
嗯，大概就是这个样子吧。&lt;br /&gt;
&lt;br /&gt;
==改进==&lt;br /&gt;
* 肖达说：“Hinton组的cuda-convnet GPU卷积库确实快，实现同样结构的卷积神经网做MNIST手写体分类，比theano的GPU卷积快5倍多。另一个发现，用sgd优化时，max kernel norm constraint比weight decay好用”。&lt;br /&gt;
* cuda-convnet, https://code.google.com/p/cuda-convnet/&lt;br /&gt;
* weight decay不知道theano用了没有&lt;br /&gt;
&lt;br /&gt;
==参考==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
* pylearn2的convnet，http://nbviewer.ipython.org/urls/raw.github.com/lisa-lab/pylearn2/master/pylearn2/scripts/tutorials/convolutional_network.ipynb&lt;br /&gt;
* theano是肖达告诉我的，GPU也是借用肖达的工作站的，非常感谢！&lt;br /&gt;
* [[深度学习读书会]]&lt;br /&gt;
* [[lwta-theano]]&lt;br /&gt;
&lt;br /&gt;
{{reply}}&lt;br /&gt;
&lt;br /&gt;
[[Category:统计学习读书会]] &lt;br /&gt;
[[Category:集智俱乐部应用项目]]&lt;br /&gt;
[[category:python]]&lt;br /&gt;
[[Category:旧词条迁移]]&lt;/div&gt;</summary>
		<author><name>Thingamabob</name></author>
	</entry>
</feed>