简单的卷积神经网络编程,卷积神经网络算法代码

关于AlphaGo的一些错误说法

最近看了一些关于alphago围棋对弈的一些人工智能的文章,尤其是美国人工智能方面教授的文章,发现此前媒体宣传的东西几乎都是错的,都是夸大了alpha狗。我做了一个阅读心得摘要。

首先是对媒体错误宣传的更正:1.alphago可以说里程碑式开创了历史,但是他并没有作出任何非常创新的技术,而deepmind只是将早已经存在的一些人工智能技术(尤其是机器辨认图片技术运用到下棋上)之前没有人想过能这样做,这种尝试是一种创新。

2.alphago并没有真正的棋感,实际也不懂得思考并作出策略,围棋解说把alphago当人来看待是错误的。alpha只是不停问自己我下这一步我胜率提高多少。

3.alphago并没有强大学习能力,达到现在棋力是基于接近1亿次棋局的模仿和推测出来的,一开始alphago只学习了16万棋局时它的棋力很弱。他不但比人学习效率差而且比马戏团的动物学习效率更差。

所以说跟李对局每一局都在进步是不可能的,一局的经验对alphago没什么影响。4.alphago其实也是基于蛮力穷举下法,只不过运用新的机器学习方法。

穷举法和机器学习不矛盾5.之前看到文章说alpha速度没深蓝快,其实alpha是深蓝的5万倍。今天用的iPhone6s计算能力都是深蓝的几十倍。

6.说人脑计算速度慢是错误的,和计算机计算速度相对应的应该是人脑神经元计算速度,保守估计人脑计算速度是每秒1000万亿次,计算能力是深蓝的10万倍。

7.alpha并不是完全学习的,首先底层需要人编程围棋规则,其次基础的下期原则也是人为输入的简单总结一下阅读心得:首先包括alpha围棋程序和深蓝的象棋都是蛮力搜索法。

也就是1.考虑所有未来可能变化,2.计算走法未来多少步的胜率,3.选择走法。但是围棋每走一步比国际象棋变化更大,步数更多,可能变化种类超过宇宙原子总和。其实这对于象棋也是如此。

深蓝雇佣大量职业象棋选手设定一个积分法,比如一个兵值多少分,吃对手一个车胜率提升多少,这个评分体系很准确,深蓝思考范围被压缩成十几步。

但是围棋无法如此评估,之前围棋程序是简单的人手输入,见到什么情况如何走,所以很死板。这些程序棋力大概是400。

2006年一种叫做蒙特卡洛树的搜索法被发明,它使用概率模拟方法(类似模拟投掷骰子)只需要判断终盘胜负,弥补了围棋不能设定确定走法函数的缺陷。

(alphago也是使用蒙特卡洛树方法)但是这方法要展开到终盘计算量太大,所以需要让围棋专家协助制定行棋规则,减少计算量。此方法可使人工智能棋力提升到业余5段。

但是十年来电脑棋力进展令人悲观,直到alphago。它在此基础上引入深度人工网络。神经网络已经发明50年,适合编写一些不直观因果关系的事物,并且软件可以自主学习调整。

但是编程太难,加上以前计算能力问题一直不受重视。6年前开始,技术上能达到10层神经元,神经网络开始兴起。结合大数据和云计算技术,神经网络开始吃香。

图像处理和人脸识别这类程序很难直观的由编程员编程,神经网络在此有用武之地,其中深度卷积网络技术称霸。alpha狗团队创新之处在于意识到可以将图像识别的这项技术用于下棋。

alpha狗团队将神经网络升级到13层,预测人类棋手走法。首先它学习了围棋对战平台的3千万业余高段位的对局记录,作为让alpha狗猜人类走法的正确答案。

也就是说alpha一开始是在模仿业余高手平均玩法。同时团队人工输入围棋知识。alpha是神经网络加手工编程混合物。这个预测人类玩法被叫做策略网络,此时alpha叫做rp版。

根据alpha狗团队的论文把策略网络加入业余3段棋力的围棋程序,其棋力能达到业余6段。

棋力提高950分达到2600(棋力分每相差230分双方5局三胜比赛的胜率为高分者95%胜率)此时alpha已经成为世界最强围棋程序。

为了减少计算量,alpha狗使用一个叫价值网络的深层卷积网络作为评估函数,使用alpha的预测结果和实际展开结果的平均值作为胜率参考信息。加入此功能的alpha狗叫做完整版。其棋力提高了450分。

达到3100。(大家要知道棋力相差500的选手之间,棋力低者想赢一盘棋都很难的,相差1000的话,棋力低者胜率几乎为0)首先刚刚入门只懂得规则的玩家棋力是0。

手写下棋规则类围棋程序的棋力大概是400多。也就是程序是当对手下什么子,程序应该怎么走,这种纯靠手工编程软件的棋力。业余棋手最低级别(1段)的棋力是1000左右。

加入神经网络的alphago棋力是1500。相当于业余4段。此时的alohago也是程序规则软件,只不过靠神经网络训练加入围棋知识而已。r版alphago棋力1700。相当于业余5段。

此时alphago加入蒙特卡洛树搜索功能,但是主要靠手写程序为基础。和r版alphago类似的程序zen棋力是2200。相当于业余7段。rp版的alphago棋力是2700。

和r版相比rp版的改进是在手工编程最基础的围棋策略基础上,加入“策略网络”该功能是一个预测对手落子位置的神经网络。因此alphago棋力大增接近1000棋力。已经成为世界最强围棋软件。

这个棋力大概是最低级别的职业选手(职业1段)的棋力。2015年下半年被alphago横扫的欧洲冠军樊麾的棋力是2900左右。相当于职业2段和3段之间水平。

完整版alphago的棋力是3100多(2015年底时)。这个版本alphago比之前增加了一个“价值网络”的深层卷积网络DCNN。

他可以在不将牌局演算到终局就评估出双方胜率也就是上一篇文章所说的大幅度减化了计算。这种技术本来是用在识别图像技术上的。此时李世石棋力是3500多。相当于超出最高段位(职业9段)水平。

柯洁的棋力是3600左右。其实宣布挑战李世石时alphago棋力落后李400左右。它是通过自己和自己大量对局来提升棋力的。

(战胜樊麾时它是通过观摩人类业余高段位对战历史数据学习,为了击败更强对手只能向更高技术的选手学习,就是自己了)。在不断对局中程序棋力不断提高,而提高的棋力自我对阵时产生更高水平的下棋数据。

虽然凌哥没看到战胜李世石时alphago的棋力但是我简单算一下推测出2016年3月战胜李时alphago棋力大概是3800左右。(因为差230分五局三胜95%胜率可以推算单局胜率80%再低一些。

李是3530左右棋力)所以当时柯洁已经不是alphago的对手了。现在alphago挑战各位围棋高手60连胜(唯一一次平局是人类棋手掉线)至于现在棋力应该是没办法评估吧。

因为一场都不输的话根本不知道棋力是多少。按照棋力计算方法应该是棋力无限大了,也就是七龙珠漫画里面的战斗力爆表了。至少输一场才能估算出其实际棋力。其他:说到alpha没有期感,和人类下棋不一样。

只要是因为人类学习下棋,是通过总结棋局规则和下法,分析因果关系和其中逻辑关系的,而alphago只是推算走这一步它的胜率提高多少(这方面和深蓝没区别只是评估方式不同)它并不是真的有智慧懂得各种谋略。

alphago学习方式只是像训练动物一样。走对了给予奖赏鼓励以后以更高概率走这步,走错了就惩罚。而且这个效率很低,其实它的高水平是通过每天学习普通职业选手一辈子也不止的时间来学习下棋得来的。

而且这个学习过程“没有高层思维和概念”,只是一个搜索过程。上文说道alphago学习效率很低。

因为alphago学习了3000万盘棋局时面对新局面应变能力很差,分析发现这些棋局很多都是冗余的只相当于16万棋局。而几十万局棋对训练alphago是不够的,它需要千万级别的棋局训练。

所以电视里职业棋手解说说alphago在每局都从李世石身上学到新技能是不可能的,一两局对alphago是没用的。而李世石反而是从alphago身上学到东西利用创新下法战胜alphago。

人类这种能力是人工智能不具备的。人工智能专家认为现在人工智能其实并不是真正的智能。alphago只是下棋能力强的软件,IBM的沃森只是智力答题能力强的机器。

真正的人工智能是让一个白板人工智能机器见到围棋,自己学习下棋规则,自己通过推理推断怎么下棋。

(现在的alphago的围棋规则和基础下棋策略都是人手编程的)deepmind致力于开发真正的人工智能程序。近期目标是玩几百种游戏都能战胜人类。这是向真正人工智能迈步。

谷歌人工智能写作项目:神经网络伪原创

怎样用python构建一个卷积神经网络

用keras框架较为方便首先安装anaconda,然后通过pip安装keras以下转自wphh的博客写作猫

#coding:utf-8'''    GPU run command:        THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python     CPU run command:        python 2016.06.06更新:这份代码是keras开发初期写的,当时keras还没有现在这么流行,文档也还没那么丰富,所以我当时写了一些简单的教程。

现在keras的API也发生了一些的变化,建议及推荐直接上看更加详细的教程。

'''#导入各种用到的模块组件from __future__ import absolute_importfrom __future__ import print_functionfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom  import Dense, Dropout, Activation, Flattenfrom keras.layers.advanced_activations import PReLUfrom keras.layers.convolutional import Convolution2D, MaxPooling2Dfrom keras.optimizers import SGD, Adadelta, Adagradfrom keras.utils import np_utils, generic_utilsfrom six.moves import rangefrom data import load_dataimport randomimport numpy as np(1024)  # for reproducibility#加载数据data, label = load_data()#打乱数据index = [i for i in range(len(data))]random.shuffle(index)data = data[index]label = label[index]print(data.shape[0], ' samples')#label为0~9共10个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数label = np_utils.to_categorical(label, 10)################开始建立CNN模型################生成一个modelmodel = Sequential()#第一个卷积层,4个卷积核,每个卷积核大小5*5。

1表示输入的图片的通道,灰度图为1通道。

#border_mode可以是valid或者full,具体看这里说明:.conv2d#激活函数用tanh#你还可以在(Activation('tanh'))后加上dropout的技巧: (Dropout(0.5))(Convolution2D(4, 5, 5, border_mode='valid',input_shape=(1,28,28))) (Activation('tanh'))#第二个卷积层,8个卷积核,每个卷积核大小3*3。

4表示输入的特征图个数,等于上一层的卷积核个数#激活函数用tanh#采用maxpooling,poolsize为(2,2)(Convolution2D(8, 3, 3, border_mode='valid'))(Activation('tanh'))(MaxPooling2D(pool_size=(2, 2)))#第三个卷积层,16个卷积核,每个卷积核大小3*3#激活函数用tanh#采用maxpooling,poolsize为(2,2)(Convolution2D(16, 3, 3, border_mode='valid')) (Activation('relu'))(MaxPooling2D(pool_size=(2, 2)))#全连接层,先将前一层输出的二维特征图flatten为一维的。

#Dense就是隐藏层。16就是上一层输出的特征图个数。

4是根据每个卷积层计算出来的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4#全连接有128个神经元节点,初始化方式为normal(Flatten())(Dense(128, init='normal'))(Activation('tanh'))#Softmax分类,输出是10类别(Dense(10, init='normal'))(Activation('softmax'))##############开始训练模型###############使用SGD + momentum#model.compile里的参数loss就是损失函数(目标函数)sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=["accuracy"])#调用fit方法,就是一个训练过程. 训练的epoch数设为10,batch_size为100.#数据经过随机打乱shuffle=True。

verbose=1,训练过程中输出的信息,0、1、2三种方式都可以,无关紧要。show_accuracy=True,训练时每一个epoch都输出accuracy。

#validation_split=0.2,将20%的数据作为验证集。

(data, label, batch_size=100, nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)"""#使用data augmentation的方法#一些参数和调用的方法,请看文档datagen = ImageDataGenerator(        featurewise_center=True, # set input mean to 0 over the dataset        samplewise_center=False, # set each sample mean to 0        featurewise_std_normalization=True, # divide inputs by std of the dataset        samplewise_std_normalization=False, # divide each input by its std        zca_whitening=False, # apply ZCA whitening        rotation_range=20, # randomly rotate images in the range (degrees, 0 to 180)        width_shift_range=0.2, # randomly shift images horizontally (fraction of total width)        height_shift_range=0.2, # randomly shift images vertically (fraction of total height)        horizontal_flip=True, # randomly flip images        vertical_flip=False) # randomly flip images# compute quantities required for featurewise normalization # (std, mean, and principal components if ZCA whitening is applied)(data)for e in range(nb_epoch):    print('-'*40)    print('Epoch', e)    print('-'*40)    print("Training...")    # batch train with realtime data augmentation    progbar = generic_utils.Progbar(data.shape[0])    for X_batch, Y_batch in (data, label):        loss,accuracy = model.train(X_batch, Y_batch,accuracy=True)        (X_batch.shape[0], values=[("train loss", loss),("accuracy:", accuracy)] )"""。

深度学习中的卷积网络到底怎么回事

这两个概念实际上是互相交叉的,例如,卷积神经网络(Convolutionalneuralnetworks,简称CNNs)就是一种深度的监督学习下的机器学习模型,而深度置信网(DeepBeliefNets,简称DBNs)就是一种无监督学习下的机器学习模型。

深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

深度学习的概念由Hinton等人于2006年提出。基于深信度网(DBN)提出非监督贪心逐层训练算法,为解决深层结构相关的优化难题带来希望,随后提出多层自动编码器深层结构。

此外Lecun等人提出的卷积神经网络是第一个真正多层结构学习算法,它利用空间相对关系减少参数数目以提高训练性能。

怎样用python构建一个卷积神经网络模型

上周末利用python简单实现了一个卷积神经网络,只包含一个卷积层和一个maxpooling层,pooling层后面的多层神经网络采用了softmax形式的输出。

实验输入仍然采用MNIST图像使用10个featuremap时,卷积和pooling的结果分别如下所示。

部分源码如下:[python] viewplain copy#coding=utf-8'''''Created on 2014年11月30日@author: Wangliaofan'''import numpyimport structimport matplotlib.pyplot as pltimport mathimport randomimport copy#testfrom BasicMultilayerNeuralNetwork import BMNN2def sigmoid(inX):if (-inX)== 0.0:return 999999999.999999999return 1.0/((-inX))def difsigmoid(inX):return sigmoid(inX)*(1.0-sigmoid(inX))def tangenth(inX):return (1.0*(inX)-1.0*(-inX))/(1.0*(inX)+1.0*(-inX))def cnn_conv(in_image, filter_map,B,type_func='sigmoid'):#in_image[num,feature map,row,col]=>in_image[Irow,Icol]#features map[k filter,row,col]#type_func['sigmoid','tangenth']#out_feature[k filter,Irow-row+1,Icol-col+1]shape_image=numpy.shape(in_image)#[row,col]#print "shape_image",shape_imageshape_filter=numpy.shape(filter_map)#[k filter,row,col]if shape_filter[1]>shape_image[0] or shape_filter[2]>shape_image[1]:raise Exceptionshape_out=(shape_filter[0],shape_image[0]-shape_filter[1]+1,shape_image[1]-shape_filter[2]+1)out_feature=numpy.zeros(shape_out)k,m,n=numpy.shape(out_feature)for k_idx in range(0,k):#rotate 180 to calculate convc_filter=numpy.rot90(filter_map[k_idx,:,:], 2)for r_idx in range(0,m):for c_idx in range(0,n):#conv_temp=numpy.zeros((shape_filter[1],shape_filter[2]))(in_image[r_idx:r_idx+shape_filter[1],c_idx:c_idx+shape_filter[2]],c_filter)(conv_temp)if type_func=='sigmoid':out_feature[k_idx,r_idx,c_idx]=sigmoid(sum_temp+B[k_idx])elif type_func=='tangenth':out_feature[k_idx,r_idx,c_idx]=tangenth(sum_temp+B[k_idx])else:raise Exceptionreturn out_featuredef cnn_maxpooling(out_feature,pooling_size=2,type_pooling="max"):k,row,col=numpy.shape(out_feature)max_index_Matirx=numpy.zeros((k,row,col))out_row=int(numpy.floor(row/pooling_size))out_col=int(numpy.floor(col/pooling_size))out_pooling=numpy.zeros((k,out_row,out_col))for k_idx in range(0,k):for r_idx in range(0,out_row):for c_idx in range(0,out_col):temp_matrix=out_feature[k_idx,pooling_size*r_idx:pooling_size*r_idx+pooling_size,pooling_size*c_idx:pooling_size*c_idx+pooling_size]out_pooling[k_idx,r_idx,c_idx](temp_matrix)max_index=numpy.argmax(temp_matrix)#print max_index#print max_index/pooling_size,max_index%pooling_sizemax_index_Matirx[k_idx,pooling_size*r_idx+max_index/pooling_size,pooling_size*c_idx+max_index%pooling_size]=1return out_pooling,max_index_Matirxdef poolwithfunc(in_pooling,W,B,type_func='sigmoid'):k,row,col=numpy.shape(in_pooling)out_pooling=numpy.zeros((k,row,col))for k_idx in range(0,k):for r_idx in range(0,row):for c_idx in range(0,col):out_pooling[k_idx,r_idx,c_idx]=sigmoid(W[k_idx]*in_pooling[k_idx,r_idx,c_idx]+B[k_idx])return out_pooling#out_feature is the out put of convdef backErrorfromPoolToConv(theta,max_index_Matirx,out_feature,pooling_size=2):k1,row,col=numpy.shape(out_feature)error_conv=numpy.zeros((k1,row,col))k2,theta_row,theta_col=numpy.shape(theta)if k1!=k2:raise Exceptionfor idx_k in range(0,k1):for idx_row in range( 0, row):for idx_col in range( 0, col):error_conv[idx_k,idx_row,idx_col]=\max_index_Matirx[idx_k,idx_row,idx_col]*\float(theta[idx_k,idx_row/pooling_size,idx_col/pooling_size])*\difsigmoid(out_feature[idx_k,idx_row,idx_col])return error_convdef backErrorfromConvToInput(theta,inputImage):k1,row,col=numpy.shape(theta)#print "theta",k1,row,coli_row,i_col=numpy.shape(inputImage)if row>i_row or col> i_col:raise Exceptionfilter_row=i_row-row+1filter_col=i_col-col+1detaW=numpy.zeros((k1,filter_row,filter_col))#the same with conv valid in matlabfor k_idx in range(0,k1):for idx_row in range(0,filter_row):for idx_col in range(0,filter_col):subInputMatrix=inputImage[idx_row:idx_row+row,idx_col:idx_col+col]#print "subInputMatrix",numpy.shape(subInputMatrix)#rotate theta 180#print numpy.shape(theta)theta_rotate=numpy.rot90(theta[k_idx,:,:], 2)#print "theta_rotate",theta_rotate(subInputMatrix,theta_rotate)detaW[k_idx,idx_row,idx_col](dotMatrix)detaB=numpy.zeros((k1,1))for k_idx in range(0,k1):detaB[k_idx](theta[k_idx,:,:])return detaW,detaBdef loadMNISTimage(absFilePathandName,datanum=60000):images=open(absFilePathandName,'rb')()index=0magic, numImages , numRows , numColumns = struct.unpack_from('>IIII' , buf , index)print magic, numImages , numRows , numColumnsindex += struct.calcsize('>IIII')if magic != 2051:raise Exceptiondatasize=int(784*datanum)datablock=">"+str(datasize)+"B"#nextmatrix=struct.unpack_from('>47040000B' ,buf, index)nextmatrix=struct.unpack_from(datablock ,buf, index)nextmatrix=numpy.array(nextmatrix)/255.0#nextmatrix=nextmatrix.reshape(numImages,numRows,numColumns)#nextmatrix=nextmatrix.reshape(datanum,1,numRows*numColumns)nextmatrix=nextmatrix.reshape(datanum,1,numRows,numColumns)return nextmatrix, numImagesdef loadMNISTlabels(absFilePathandName,datanum=60000):labels=open(absFilePathandName,'rb')()index=0magic, numLabels  = struct.unpack_from('>II' , buf , index)print magic, numLabelsindex += struct.calcsize('>II')if magic != 2049:raise Exceptiondatablock=">"+str(datanum)+"B"#nextmatrix=struct.unpack_from('>60000B' ,buf, index)nextmatrix=struct.unpack_from(datablock ,buf, index)nextmatrix=numpy.array(nextmatrix)return nextmatrix, numLabelsdef simpleCNN(numofFilter,filter_size,pooling_size=2,maxIter=1000,imageNum=500):decayRate=0.01MNISTimage,num1=loadMNISTimage("F:\Machine Learning\UFLDL\data\common\\train-images-idx3-ubyte",imageNum)print num1row,col=numpy.shape(MNISTimage[0,0,:,:])out_Di=numofFilter*((row-filter_size+1)/pooling_size)*((col-filter_size+1)/pooling_size)MLP=BMNN2.MuiltilayerANN(1,[128],out_Di,10,maxIter)MLP.setTrainDataNum(imageNum)MLP.loadtrainlabel("F:\Machine Learning\UFLDL\data\common\\train-labels-idx1-ubyte")MLP.initialweights()#MLP.printWeightMatrix()rng = numpy.random.RandomState(23455)W_shp = (numofFilter, filter_size, filter_size)W_bound = (numofFilter * filter_size * filter_size)W_k=rng.uniform(low=-1.0 / W_bound,high=1.0 / W_bound,size=W_shp)B_shp = (numofFilter,)B= numpy.asarray(rng.uniform(low=-.5, high=.5, size=B_shp))cIter=0while cIter。

CNN(卷积神经网络)是什么?

在数字图像处理的时候我们用卷积来滤波是因为我们用的卷积模版在频域上确实是高通低通带通等等物理意义上的滤波器。

然而在神经网络中,模版的参数是训练出来的,我认为是纯数学意义的东西,很难理解为在频域上还有什么意义,所以我不认为神经网络里的卷积有滤波的作用。接着谈一下个人的理解。

首先不管是不是卷积神经网络,只要是神经网络,本质上就是在用一层层简单的函数(不管是sigmoid还是Relu)来拟合一个极其复杂的函数,而拟合的过程就是通过一次次backpropagation来调参从而使代价函数最小。

卷积神经网络minist为什么输出是28*28

看数字图片而定。如果图片较小并且质量还不错,那么通过2层的神经网络就能胜任。对于MNIst数据集(28*28的手写数字),2层神经网络准确率可达99%,svm也有98%以上。

以上实现非常简单,matlab已经有现成工具箱。卷积神经网络通常用于更加复杂的场合,闭合是被图像内容等。

在MNIST数据集上cnn可达99.7%准确率,但是实现起来较为复杂,需要通过开源框架caffe,keras等进行编程。

如果对准确率要求没有达到小数点后两位的程度,用简单的svm,神经网络,softmax等调调参数就行了。

 

你可能感兴趣的:(cnn,算法,人工智能,神经网络)