【theano-windows】学习笔记九——softmax手写数字分类

前言

上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmaxlogistic回归分类的联系, 我在之前写过一个小博客

国际惯例, 参考博客走一波:

Classifying MNIST digits using Logistic Regression

softmax理论及代码解读——UFLDL

softmax简介

直接码公式了,理论就不说了:

各标签概率:

P(y(i)=1|x(i);W,b)=ewix(i)+biki=1ewix(i)+bi

其实每个单元值得计算就是 ewix+bi,其中 wi就是连接输入神经元和第 i个神经元的权重,bi就是第 i个神经元的偏置, 最后为了保证概率和为1, 进行了归一化而已.

获取当前预测值,也就是概率最大的那个标签, 可以用它来计算准确率

ypred=argmaxiP(Y=i|xi;W,b)

代价函数为负对数似然:

J(θ)=1mi=1mj=1k1{y(i)=j}logP(y(i)=1|x(i);W,b)

梯度就不求了,直接用 theano的自动梯度函数 grad()

算法实现

【PS】官方代码加上注释竟然能达到五百多行,这是有多么生猛。

导入包

导入包就不用说了,需要用到处理文件路径, 和解压以及读取数据的模块

import theano
import theano.tensor as T
import numpy as np
import cPickle,gzip#读取数据解压用的
import os#路径相关操作需要
import timeit#时间

读取数据

#读取数据集
def load_data(dataset):data_dir,data_file=os.path.split(dataset)if os.path.isfile(dataset):with gzip.open(dataset,'rb') as f:train_set,valid_set,test_set=cPickle.load(f)#共享数据集def shared_dataset(data_xy,borrow=True):data_x,data_y=data_xyshared_x=theano.shared(np.asarray(data_x,dtype=theano.config.floatX),borrow=borrow)shared_y=theano.shared(np.asarray(data_y,dtype=theano.config.floatX),borrow=borrow)return shared_x,T.cast(shared_y,'int32')#定义三个元组分别返回训练集,验证集,测试集train_set_x,train_set_y=shared_dataset(train_set)valid_set_x,valid_set_y=shared_dataset(valid_set)test_set_x,test_set_y=shared_dataset(test_set)rval=[(train_set_x,train_set_y),(valid_set_x,valid_set_y),(test_set_x,test_set_y)]return rval

分类器函数

定义一个分类器类, 用于存储模型参数以及实现负对数似然和模型当前预测误差的计算, 以及负对数似然就是上面那个带有log的式子, 将当前样本所应属的类别的概率相加求均值即可. 误差就是当前样本有多少个识别错误了, 看看当前样本所属的最大概率类别是不是它所应属的类别, 然后求均值就得到了误差

#定义分类器相关操作
class LogisticRegression(object):def __init__(self,input,n_in,n_out):#共享权重self.W=theano.shared(value=np.zeros((n_in,n_out),dtype=theano.config.floatX),name='W',borrow=True)#共享偏置self.b=theano.shared(value=np.zeros((n_out,),dtype=theano.config.floatX),name='b',borrow=True)#softmax函数self.p_y_given_x=T.nnet.softmax(T.dot(input,self.W)+self.b)#预测值self.y_pred=T.argmax(self.p_y_given_x,axis=1)self.params=[self.W,self.b]#模型参数self.input=input#模型输入#定义负对数似然def negative_log_likelihood(self,y):return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]),y])#定义误差def errors(self, y):if y.ndim != self.y_pred.ndim:#查看维度是不是一样raise TypeError('y should have the same shape as self.y_pred',('y', y.type, 'y_pred', self.y_pred.type))if y.dtype.startswith('int'):#查看y的类型是不是正确的return T.mean(T.neq(self.y_pred, y))#neq是判断相等(0)和不等(1)else:raise NotImplementedError()

训练

以下操作都放在一个函数sgd_mnist

def sgd_mnist(learning_rate=0.13,n_epochs=1000,dataset='mnist.pkl.gz',batch_size=600):

首先通过读取函数load_data读取数据, 并且建立好分批索引

#处理数据集datasets=load_data(dataset)#读取数据集train_set_x,train_set_y=datasets[0]#训练集valid_set_x,valid_set_y=datasets[1]#验证集test_set_x,test_set_y=datasets[2]#测试集print '验证集大小',valid_set_x.get_value().shape#看看是否读取成功#总共多少批数据,注意共享变量数据用get_value获取n_train_batches=train_set_x.get_value(borrow=True).shape[0]//batch_sizen_valid_batches=valid_set_x.get_value(borrow=True).shape[0]//batch_sizen_test_batches=test_set_x.get_value(borrow=True).shape[0]//batch_size

然后建立两个容器去存储每批输入的数据, 顺便想象一下, 我们后面每次在function中迭代计算就用givens去不断替换这个容器里面的数据就能实现每次迭代都是不同批次的数据, 注意数据是包含图片和标签的, 所以需要矩阵和向量存储

 #建立模型print '建立模型'index=T.lscalar()#索引数据所属批次x=T.matrix('x')#栅格化图片数据y=T.ivector('y')#数据标签,不要直接使用vector

然后把分类器初始化一下,其实就是权重和偏置初始化一下

 #初始化分类器:输入,输入大小,输出大小classifier=LogisticRegression(input=x,n_in=28*28,n_out=10)cost=classifier.negative_log_likelihood(y)

权重和偏置的更新梯度, 以及放到function去编译

#权重和偏置更新g_W=T.grad(cost=cost,wrt=classifier.W)#损失对权重的导数g_b=T.grad(cost=cost,wrt=classifier.b)#损失对偏置的导数#更新偏置和梯度,注意每次迭代要在givens中替换批数据updates=[(classifier.W,classifier.W-learning_rate*g_W),(classifier.b,classifier.b-learning_rate*g_b)]train_mode=theano.function(inputs=[index],outputs=cost,updates=updates,givens={x:train_set_x[index*batch_size:(index+1)*batch_size],y:train_set_y[index*batch_size:(index+1)*batch_size]})

当然我们机器学习中还有两个数据集:验证集和测试集, 都有各自的作用, 我们定义一下模型的测试函数

 #验证集测试模型valid_mode=theano.function(inputs=[index],outputs=classifier.errors(y),givens={x:valid_set_x[index*batch_size:(index+1)*batch_size],y:valid_set_y[index*batch_size:(index+1)*batch_size]})#测试集误差test_mode=theano.function(inputs=[index],outputs=classifier.errors(y),givens={x:test_set_x[index*batch_size:(index+1)*batch_size],y:test_set_y[index*batch_size:(index+1)*batch_size]

接下来就是利用上一篇博客中所说的提前终止算法进行训练了

#训练开始, 使用提前终止法训练print '训练开始'patience=5000#初始patiencepatience_increase=2#增量improvement_threshold=0.995#性能提升阈值validation_frequency=min(n_train_batches,patience//2)#至少每个patience预测两次best_validation_loss=np.inf#最好的预测值test_score=0start_time=timeit.default_timer()done_looping=False#是否停止循环epoch=0#初始迭代次数while (epoch<n_epochs) and (not done_looping):epoch=epoch+1for minibatch_index in range(n_train_batches):minibatch_avg_cost=train_mode(minibatch_index)#对数似然目标函数值iter=(epoch-1)*n_train_batches+minibatch_index#当前迭代批次数#验证集误差if (iter+1)%validation_frequency==0:validation_loss=[valid_mode(i) for i in range(n_valid_batches)]this_validation_loss=np.mean(validation_loss)print 'epoch %i, minibatch %i/%i, validation error: %f %%' %\(epoch,minibatch_index+1,n_train_batches,this_validation_loss*100.)#阈值判断性能提升if this_validation_loss<best_validation_loss:if this_validation_loss<best_validation_loss*improvement_threshold:patience=max(patience,iter*patience_increase)best_validation_loss=this_validation_loss#如果性能提升,就重新记录最优值test_loss=[test_mode(i) for i in range(n_test_batches)]test_score=np.mean(test_loss)print 'epoch %i minibatch %i/%i,test error of best model %f%%' %\(epoch,minibatch_index+1,n_train_batches,test_score*100.)#存储最好的模型参数with open('best_model.pkl','wb') as f:cPickle.dump(classifier,f)if patience<=iter:done_looping=Truebreakend_time=timeit.default_timer()print 'Optimization complete with best validation score of %f %%,'\'with test performance %f %%'\% (best_validation_loss * 100., test_score * 100.)print 'The code run for %d epochs,with %f epochs/sec'\%(epoch,1.*epoch/(end_time-start_time))

执行主函数进行训练

#开始训练
sgd_mnist()

结果

验证集大小 (10000L, 784L)
建立模型
训练开始
epoch 1, minibatch 83/83, validation error: 12.458333 %
epoch 1 minibatch 83/83,test error of best model 12.375000%
epoch 2, minibatch 83/83, validation error: 11.010417 %
epoch 2 minibatch 83/83,test error of best model 10.958333%
epoch 3, minibatch 83/83, validation error: 10.312500 %
epoch 3 minibatch 83/83,test error of best model 10.312500%
epoch 4, minibatch 83/83, validation error: 9.875000 %
epoch 4 minibatch 83/83,test error of best model 9.833333%
epoch 5, minibatch 83/83, validation error: 9.562500 %
epoch 5 minibatch 83/83,test error of best model 9.479167%
epoch 6, minibatch 83/83, validation error: 9.322917 %
epoch 6 minibatch 83/83,test error of best model 9.291667%
epoch 7, minibatch 83/83, validation error: 9.187500 %
epoch 7 minibatch 83/83,test error of best model 9.000000%
epoch 8, minibatch 83/83, validation error: 8.989583 %
epoch 8 minibatch 83/83,test error of best model 8.958333%
epoch 9, minibatch 83/83, validation error: 8.937500 %
epoch 9 minibatch 83/83,test error of best model 8.812500%
epoch 10, minibatch 83/83, validation error: 8.750000 %
epoch 10 minibatch 83/83,test error of best model 8.666667%
epoch 11, minibatch 83/83, validation error: 8.666667 %
epoch 11 minibatch 83/83,test error of best model 8.520833%
epoch 12, minibatch 83/83, validation error: 8.583333 %
epoch 12 minibatch 83/83,test error of best model 8.416667%
epoch 13, minibatch 83/83, validation error: 8.489583 %
epoch 13 minibatch 83/83,test error of best model 8.291667%
epoch 14, minibatch 83/83, validation error: 8.427083 %
epoch 14 minibatch 83/83,test error of best model 8.281250%
epoch 15, minibatch 83/83, validation error: 8.354167 %
epoch 15 minibatch 83/83,test error of best model 8.270833%
epoch 16, minibatch 83/83, validation error: 8.302083 %
epoch 16 minibatch 83/83,test error of best model 8.239583%
epoch 17, minibatch 83/83, validation error: 8.250000 %
epoch 17 minibatch 83/83,test error of best model 8.177083%
epoch 18, minibatch 83/83, validation error: 8.229167 %
epoch 18 minibatch 83/83,test error of best model 8.062500%
epoch 19, minibatch 83/83, validation error: 8.260417 %
epoch 20, minibatch 83/83, validation error: 8.260417 %
epoch 21, minibatch 83/83, validation error: 8.208333 %
epoch 21 minibatch 83/83,test error of best model 7.947917%
epoch 22, minibatch 83/83, validation error: 8.187500 %
epoch 22 minibatch 83/83,test error of best model 7.927083%
epoch 23, minibatch 83/83, validation error: 8.156250 %
epoch 23 minibatch 83/83,test error of best model 7.958333%
epoch 24, minibatch 83/83, validation error: 8.114583 %
epoch 24 minibatch 83/83,test error of best model 7.947917%
epoch 25, minibatch 83/83, validation error: 8.093750 %
epoch 25 minibatch 83/83,test error of best model 7.947917%
epoch 26, minibatch 83/83, validation error: 8.104167 %
epoch 27, minibatch 83/83, validation error: 8.104167 %
epoch 28, minibatch 83/83, validation error: 8.052083 %
epoch 28 minibatch 83/83,test error of best model 7.843750%
epoch 29, minibatch 83/83, validation error: 8.052083 %
epoch 30, minibatch 83/83, validation error: 8.031250 %
epoch 30 minibatch 83/83,test error of best model 7.843750%
epoch 31, minibatch 83/83, validation error: 8.010417 %
epoch 31 minibatch 83/83,test error of best model 7.833333%
epoch 32, minibatch 83/83, validation error: 7.979167 %
epoch 32 minibatch 83/83,test error of best model 7.812500%
epoch 33, minibatch 83/83, validation error: 7.947917 %
epoch 33 minibatch 83/83,test error of best model 7.739583%
epoch 34, minibatch 83/83, validation error: 7.875000 %
epoch 34 minibatch 83/83,test error of best model 7.729167%
epoch 35, minibatch 83/83, validation error: 7.885417 %
epoch 36, minibatch 83/83, validation error: 7.843750 %
epoch 36 minibatch 83/83,test error of best model 7.697917%
epoch 37, minibatch 83/83, validation error: 7.802083 %
epoch 37 minibatch 83/83,test error of best model 7.635417%
epoch 38, minibatch 83/83, validation error: 7.812500 %
epoch 39, minibatch 83/83, validation error: 7.812500 %
epoch 40, minibatch 83/83, validation error: 7.822917 %
epoch 41, minibatch 83/83, validation error: 7.791667 %
epoch 41 minibatch 83/83,test error of best model 7.625000%
epoch 42, minibatch 83/83, validation error: 7.770833 %
epoch 42 minibatch 83/83,test error of best model 7.614583%
epoch 43, minibatch 83/83, validation error: 7.750000 %
epoch 43 minibatch 83/83,test error of best model 7.593750%
epoch 44, minibatch 83/83, validation error: 7.739583 %
epoch 44 minibatch 83/83,test error of best model 7.593750%
epoch 45, minibatch 83/83, validation error: 7.739583 %
epoch 46, minibatch 83/83, validation error: 7.739583 %
epoch 47, minibatch 83/83, validation error: 7.739583 %
epoch 48, minibatch 83/83, validation error: 7.708333 %
epoch 48 minibatch 83/83,test error of best model 7.583333%
epoch 49, minibatch 83/83, validation error: 7.677083 %
epoch 49 minibatch 83/83,test error of best model 7.572917%
epoch 50, minibatch 83/83, validation error: 7.677083 %
epoch 51, minibatch 83/83, validation error: 7.677083 %
epoch 52, minibatch 83/83, validation error: 7.656250 %
epoch 52 minibatch 83/83,test error of best model 7.541667%
epoch 53, minibatch 83/83, validation error: 7.656250 %
epoch 54, minibatch 83/83, validation error: 7.635417 %
epoch 54 minibatch 83/83,test error of best model 7.520833%
epoch 55, minibatch 83/83, validation error: 7.635417 %
epoch 56, minibatch 83/83, validation error: 7.635417 %
epoch 57, minibatch 83/83, validation error: 7.604167 %
epoch 57 minibatch 83/83,test error of best model 7.489583%
epoch 58, minibatch 83/83, validation error: 7.583333 %
epoch 58 minibatch 83/83,test error of best model 7.458333%
epoch 59, minibatch 83/83, validation error: 7.572917 %
epoch 59 minibatch 83/83,test error of best model 7.468750%
epoch 60, minibatch 83/83, validation error: 7.572917 %
epoch 61, minibatch 83/83, validation error: 7.583333 %
epoch 62, minibatch 83/83, validation error: 7.572917 %
epoch 62 minibatch 83/83,test error of best model 7.520833%
epoch 63, minibatch 83/83, validation error: 7.562500 %
epoch 63 minibatch 83/83,test error of best model 7.510417%
epoch 64, minibatch 83/83, validation error: 7.572917 %
epoch 65, minibatch 83/83, validation error: 7.562500 %
epoch 66, minibatch 83/83, validation error: 7.552083 %
epoch 66 minibatch 83/83,test error of best model 7.520833%
epoch 67, minibatch 83/83, validation error: 7.552083 %
epoch 68, minibatch 83/83, validation error: 7.531250 %
epoch 68 minibatch 83/83,test error of best model 7.520833%
epoch 69, minibatch 83/83, validation error: 7.531250 %
epoch 70, minibatch 83/83, validation error: 7.510417 %
epoch 70 minibatch 83/83,test error of best model 7.500000%
epoch 71, minibatch 83/83, validation error: 7.520833 %
epoch 72, minibatch 83/83, validation error: 7.510417 %
epoch 73, minibatch 83/83, validation error: 7.500000 %
epoch 73 minibatch 83/83,test error of best model 7.489583%
Optimization complete with best validation score of 7.500000 %,with test performance 7.489583 %
The code run for 74 epochs,with 6.870845 epochs/sec

测试

一般测试分为两种:

  • 批量测试: 一次性丢一堆数据进去, 测试这一堆数据的准确率
  • 单样本测试: 自己手写一个数字, 然后调用模型预测一下

批样本测试

想一下, 我们训练的时候是分批丢进去的, 那么批量测试是否可以复制相同部分的代码进而减少代码量呢?(答案是挺麻烦的, 继续往下看)

  • 因为存储的就是训练好的LogisticRegression的值, 那么我们在测试的时候就可以直接调用它里面的函数, 而且跳过初始化__init__方法, 但是发现train_mode(),test_mode(),valid_mode()方法中的input都只是单纯的索引, 而非索引的批数据, 而LogisticRegression中的输入是真实数据而非索引, 那么是怎么将索引变成索引的数据而输入到LogisticRegression中的呢?答案就是通过初始化classifier=LogisticRegression(input=x,n_in=28*28,n_out=10), 这就实现了theano.fuction中的givens中得到的数据x被传递给分类器了.

  • 然而调用训练好的模型去做分类并不需要初始化, 那么我们也就不能使用批索引作为初始化inputs, 因为我们没法从givens中将数据丢给x, 进而丢入到分类器中. 说白了也就是不能进行如下操作

    
    #由于缺少分类器初始化函数, 而无法将index得到的x丢入到分类器#无法通过此代码实现批量准确率测试test_mode=theano.function(inputs=[index],outputs=classifier.errors(y),givens={x:test_set_x[index*batch_size:(index+1)*batch_size],y:test_set_y[index*batch_size:(index+1)*batch_size]

解决方法:

  • 第一个方法是对于python学得好的同学, 如果知道如何对classifier进行初始化以后, 再将权重替换给classifier即可, 操作类似下面几句话

    classifier=LogisticRegression(input=x,n_in=28*28,n_out=10)
    classifier.W=训练好的模型.W
    classifier.b=训练好的模型.b

    当然我尝试过上面这个代码, 暂时无法赋值成功, 可能我python功底不到家o(╯□╰)o(更新日志:之前忘记要使用set_value()才能设置共享参数的值了, 这里就不试了,在下一章节多层感知器可能会用到这个方法)

  • 第二个方法就是不使用LogisticRegression中的errors函数, 直接使用y_pred预测一下, 然后再与真实标签作对比, 类似于这样

    
    ## 批量预测准确率#读取数据集dataset='mnist.pkl.gz'
    datasets=load_data(dataset)
    test_set_x,test_set_y=datasets[2]
    test_set_x=test_set_x.get_value()#定义存储图片和标签的容器x=T.matrix('x')
    y=T.ivector('y')#定义批量测试参数batch_size=1000
    n_test_batches=test_set_x.shape[0]//batch_size#度量准确率的函数a=T.ivector('a')
    b=T.ivector('b')
    z=T.mean(T.eq(a,b))
    true_per=theano.function([a,b],z)#读取模型classifier=cPickle.load(open('best_model.pkl'))#编译函数predict_model=theano.function(inputs=[classifier.input],outputs=classifier.y_pred)#预测值for index in range(n_test_batches):x=test_set_x[index*batch_size:(index+1)*batch_size]y=test_set_y[index*batch_size:(index+1)*batch_size]predicted_values=predict_model(x)predicted_values=predicted_values.astype(np.int32)correct=true_per(predicted_values,y.eval())print 'Batch %d\'s correct ratio is %f %%' %(index,correct)

    结果

    Batch 0's correct ratio is 0.911000 %
    Batch 1's correct ratio is 0.886000 %
    Batch 2's correct ratio is 0.902000 %
    Batch 3's correct ratio is 0.905000 %
    Batch 4's correct ratio is 0.902000 %
    Batch 5's correct ratio is 0.941000 %
    Batch 6's correct ratio is 0.937000 %
    Batch 7's correct ratio is 0.955000 %
    Batch 8's correct ratio is 0.972000 %
    Batch 9's correct ratio is 0.914000 %

    我后来又想, 上述代码如果使用for循环去调用LogisticRegressionerrors()函数去获取每批数据的准确率, 那就在每个for循环中使用一次

    predict_model=theano.function(inputs=[classifier.input],outputs=classifier.errors(test_set_y))

    每次的inputs是不同的数据, 后来发现这个test_set_y的标签并不是作为errors函数的输入, 也就是说即使你丢入一批数据, 这个标签也是一股脑丢进去的, 那么就会出现预测标签维度(批数据集)小于真实输入的标签维度(整个数据集), 那么解决方法就是改errors这个函数, 但是改完也得折腾训练之类的, 所以我就偷懒不改了, 此想法作废

    但是呢, 如果你的测试集不大, 那就一股脑全丢进去, 代码更简单,直接使用error函数

    
    #读取数据集dataset='mnist.pkl.gz'
    datasets=load_data(dataset)
    test_set_x,test_set_y=datasets[2]
    test_set_x=test_set_x.get_value()#读取模型classifier=cPickle.load(open('best_model.pkl'))#编译函数predict_model=theano.function(inputs=[classifier.input],outputs=classifier.errors(test_set_y))#预测值predicted_values=predict_model(test_set_x)
    print "Predicted values for the first 10 examples in test set:",1-predicted_values#Predicted values for the first 10 examples in test set: 0.9225
    

单样本测试

  • 如果是测试集的某个样本想取出来看看, 比如想看看第九个样本的预测值和真实值, 那么

    
    #读取数据集dataset='mnist.pkl.gz'
    datasets=load_data(dataset)
    test_set_x,test_set_y=datasets[2]
    test_set_x=test_set_x.get_value()#读取模型classifier=cPickle.load(open('best_model.pkl'))#编译函数predict_model=theano.function(inputs=[classifier.input],outputs=classifier.y_pred)#预测值predicted_values=predict_model(test_set_x[9:10])
    print "Predicted values for the first 10 examples in test set:",predicted_values
    print "Real values for the first 10 examples in test set:",test_set_y[9:10].eval()
    '''
    Predicted values for the first 10 examples in test set: [9]
    Real values for the first 10 examples in test set: [9]
    '''

    当然上述代码如果改成predicted_values=predict_model(test_set_x[:10])就是测试前十个样本0-9的标签啦.

  • 如果是自己的手写数字图片, 比如我之前写的博客【caffe-Windows】mnist实例编译之model的使用-classification中的手写数字样本(密码bead).
    吸取当时在caffe中识别自己手写数字的教训, 我们需要核对的有:

    1. 读取通道顺序(高*宽*通道?宽*高*通道?)
    2. 数据是否需要被归一化(一般都是一定的)
    3. 因为是pythontheano, 数据类型和维度一定要统一

    第一点就不说了(因为我不想测试, 咳咳); 第二点归一化(除以255), 第三点要注意了:

    dataset='mnist.pkl.gz'
    datasets=load_data(dataset)
    test_set_x,test_set_y=datasets[2]
    test_set_x=test_set_x.get_value()
    print test_set_x[9:10].dtype#float32
    print type(test_set_x[9:10])#<type 'numpy.ndarray'>
    print test_set_x[9:10].shape#(1L, 784L)

    好了,接下来我们把自己的图片转换一波, 在丢到模型中

    from skimage import io
    import matplotlib.pyplot as plt
    mnist_data=io.imread('./binarybmp/3.bmp')
    io.imshow(mnist_data)
    plt.show()img_mnist=np.array([mnist_data.reshape(1,28*28)],dtype=np.float32)
    img_mnist=img_mnist/255.0#读取模型classifier=cPickle.load(open('best_model.pkl'))#编译函数predict_model=theano.function(inputs=[classifier.input],outputs=classifier.y_pred)
    print img_mnist[0].dtype#预测值predicted_values=predict_model(img_mnist[0])
    print "Predicted values for our example:",predicted_values

    这里写图片描述

结语

本次学习遇到的主要有有很多, 前面的坑忘记了,但是最后一个坑是如何取出theano.tensor.cast后的数据, 答案是eval()函数, 还有一个坑是经常出现这个错误:

theano.compile.function_module.UnusedInputError: theano.function was asked to create a function computing outputs given certain inputs, but the provided input variable at index 0 is not part of the computational graph needed to compute the outputs: X. To make this error into a warning, you can pass the parameter on_unused_input='warn' to theano.function. To disable it completely, use on_unused_input='ignore'.

虽然我忘记怎么解决的了,但是一定是代码出现了错误, 不要尝试什么warn或者ignore之类的, 仔细核对代码, 认真查看每一个变量类型即可, 说的轻松, 这个softmax手写数字折腾了 我两天, 好怀念matlab咳咳咳咳咳咳

因为是初学python, 而且theano也是现学现卖, 所以整个历程很可能出现各种错误, 希望看到这篇学习记录的新手多多一起讨论,也希望大佬们可以多多给出建议, 非常感谢.

code地址:

官方代码:链接: https://pan.baidu.com/s/1jIL0M0m 密码: h2dt

本文代码:链接: https://pan.baidu.com/s/1catYii 密码: 693s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求&#xff0c;这么神奇的网络是时候分析一波了&#xff0c;我个人的学习方法调试代码&#xff0c;然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…

【theano-windows】学习笔记十二——卷积神经网络

前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上&#xff1f; 卷积小知识 三大特性&#xff1a;局部感知(稀疏连接), 权值共享, 池化 上图很重要, 描述的是前一个隐层m-1具有四…

【theano-windows】学习笔记十三——去噪自编码器

前言 上一章节学习了卷积的写法,主要注意的是其实现在theano.tensor.nnet和theano.sandbox.cuda.dnn中都有对应函数实现, 这一节就进入到无监督或者称为半监督的网络构建中. 首先是自编码器(Autoencoders)和降噪自编码器(denoising Autoencoders) 国际惯例, 参考网址: Denoi…

【theano-windows】学习笔记十四——堆叠去噪自编码器

前言 前面已经学习了softmax,多层感知器,CNN&#xff0c;AE&#xff0c;dAE&#xff0c;接下来可以仿照多层感知器的方法去堆叠自编码器 国际惯例&#xff0c;参考文献&#xff1a; Stacked Denoising Autoencoders (SdA) Greedy Layer-Wise Training of Deep Networks 理…

【theano-windows】学习笔记十五——受限玻尔兹曼机

前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考博客,超级强推第二个博客, 证明过程很给力: Restricted Boltzmann Machines (R…

【Ogre-windows】环境配置

前言 由于工程原因, 学习一下Ogre面向对象图形渲染开源引擎, 慢慢爬坑吧。首先还是环境的配置问题哎. 其实最重要的是要预先编译三方库, 虽然官方说可以自动编译, 但是在自己电脑上还是出现了无法解析外部符号之类的问题, 正常情况下我就认为是三方库的lib出现了问题, 最后额外…

【theano-windows】学习笔记十六——深度信念网络DBN

前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(deep Boltzmann machine), 这里就先学习一下DBN. 国际惯例, 参考博文: Deep Belief Networks A fast lear…

【Ogre-windows】实例配置

前言 折腾了好久才搞定教程实例, 主要是因为上一篇博客安装的具体版本是Ogre1.10.9, 而官方的Ogre Wiki Tutorial Framework没有指定具体版本, 如果单纯下载Ogre Wiki Tutorial Framework 1.10 - (Windows line endings, updated 2015-10-15) 运行, 基本会血崩. 所以, 在经过仔…

【Ogre-windows】旋转矩阵及位置解析

前言 这篇博客主要针对三种问题 如何创建动画帧如何获取全局位置如何计算全局旋转矩阵 仿真环境为VS2013Ogre1.10.9与matlab验证 创建动画帧 这里只做一个简单的实验: 将自带的人物模型Jaiqua的run运动给新创建的运动myrun中并播放&#xff0c;直接贴代码了 void JaiQua:…

BP推导——续

前言 之前有证明过一次人工神经网络——【BP】反向传播算法证明 &#xff0c;但是回头看的时候&#xff0c;有很多地方非常不严谨&#xff0c;特此拿出来再单独证明一次BP&#xff0c;并严格保证其严谨性。如果想看看粗略的证明&#xff0c;可以去看我之前的博客&#xff0c;毕…

matlab学习——强连通分量

前言 最近motion graph相关实验&#xff0c;发现实现运动过渡需要构建运动图&#xff0c;而为了避免运动过渡陷入死胡同&#xff0c;需要对图结构进行裁剪&#xff0c;方法就是计算图模型的极大强联通分量&#xff0c;但是自己懒得去实现&#xff0c;所以就去搜了一下matlab中…

【音频处理】离散傅里叶变换

前言 最近复现音乐驱动舞蹈的文章《Dancing-to-Music Character Animation》&#xff0c;用到了与傅里叶变换很相似的称为常Q变换的方法去分割音乐&#xff0c;所以对傅里叶变换做了一个小了解&#xff0c;本文不深入各种乱糟糟的理论&#xff0c;比如什么蝶形算法啥的&#x…

【音频处理】短时傅里叶变换

前言 上一篇博客讲了离散傅里叶变换&#xff0c;里面的实例是对整个信号进行计算&#xff0c;虽然理论上有N点傅里叶变换(本博客就不区分FFT和DFT了&#xff0c;因为它俩就是一个东东&#xff0c;只不过复杂度不同)&#xff0c;但是我个人理解是这个N点是信号前面连续的N个数值…

【theano-windows】学习笔记十九——循环神经网络

前言 前面已经介绍了RBM和CNN了&#xff0c;就剩最后一个RNN了&#xff0c;抽了一天时间简单看了一下原理&#xff0c;但是没细推RNN的参数更新算法BPTT&#xff0c;全名是Backpropagation Through Time。 【注】严谨来说RNN有两个称呼&#xff1a;①结构上递归的recursive n…

【theano-windows】学习笔记二十——LSTM理论及实现

前言 上一篇学习了RNN&#xff0c;也知道了在沿着时间线对上下文权重求梯度的时候&#xff0c;可能会导致梯度消失或者梯度爆炸&#xff0c;然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例&#xff0c;参考网址&#xff1a; LSTM Networks for Sentiment Analysis …

刚体运动学——欧拉角、四元数、旋转矩阵

前言 刚体运动旋转一般用&#xff1a;欧拉角、四元数、轴角对等表示&#xff0c;在对某个坐标旋转的时候&#xff0c;只需将欧拉角或四元数转换为旋转矩阵&#xff0c;并与原始坐标相乘&#xff0c;便可得到旋转以后的坐标。这里主要看看欧拉角、四元数和旋转矩阵。 国际惯例…

刚体运动学-四元数插值

前言 之前对写了一篇关于刚体运动学相关知识博客&#xff1a;刚体运动学——欧拉角、四元数、旋转矩阵&#xff0c;本篇博客就举例来说明&#xff0c;如何在运动捕捉数据中进行四元数插值。 国际惯例&#xff0c;参考博客&#xff1a; 探讨&#xff1a;向量&#xff08;方向…

【TensorFlow-windows】学习笔记一——基础理解

前言 因为Theano已经停止更新了&#xff0c;所以在前面学完Theano搭建RBM,CNN,RNN相关结构以后&#xff0c;还是得选择一个主流框架的&#xff0c;由于我自身的学习最终是向强化学习靠近&#xff0c;可能用到的仿真环境是openai gym&#xff0c;所以选择了继续学习TensorFlow&…