1.当你在不断的学习之后,你会发现,tensorflow编程过于复杂,你迫切的需求一种简化的框架去实现,然后,你发现tensorflow下面有一个叫keras 的框架,这时候...你嘿嘿嘿...
我们先来尝试分析下tensorflow和keras的区别:
tensorflow实现了一整套的算法流程,也就是是,输入是什么,输出是什么,中间过程应该怎么变化的,它都给你安排的明明白白的,这样的好处是...它出错的时候,你可以知道为啥错了。
我们先贴一段keras的代码:
from keras.models import Sequential
from tensorflow.examples.tutorials.mnist import input_data
from keras.layers import Dense,Dropout,Activation,Flatten
from keras.layers import Convolution2D,MaxPool2D
from keras.utils import np_utils
from keras import backend as K
K.set_image_dim_ordering('th')
minist = input_data.read_data_sets("MNIST_data",one_hot= True)
xtrain = minist.train.images
ytrain = minist.train.labels
# (xTest,yTest) = minist.test
xtest = minist.test.images
ytest = minist.test.labels
print(xtrain.shape)
xtrain = xtrain.reshape(xtrain.shape[0],1,28,28)
xtest = xtest.reshape(xtest.shape[0],1,28,28)
ytrain = ytrain.reshape(ytrain.shape[0],10)
ytest = ytest.reshape(ytest.shape[0],10)
model = Sequential()
model.add(Convolution2D(32,(3,3),activation='relu',input_shape=(1,28,28),padding='SAME'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer= 'adam',metrics=['accuracy'])
model.fit(xtrain,ytrain,batch_size=100,epochs=10)
print(model.output_shape)
这是手写数字识别的一个案例,tensorflow-gpu版本是1.1.2, 使用的是minist数据集
我们在今后的很长一段时间都会和keras打交道
一个神经网络模型可以简化为这个过程:
1.对数据进行分析:
在上面的那个代码中,我们使用的数据是mnist数据集,数据格式是
训练数据:[数据数量,通道数,行数,列数] = [55000,1,28,28]
标签数据:[数据标签,类型个数] = [55000,10]
这一部分和tensorflow中基本一样
2.对网络进行分析(卷积过程分析)
keras主要是通过对象进行编程,面向对象十分友好,这和古老的c++的程序式编程,简直了..哈哈
定义一个模型
然后我们可以之间平铺一层卷积层
激活都帮你做好了
我们参考之前的tensorflow的代码
它指定了卷积核数量,以及卷积核的row和col,但是隐藏了:输入的卷积核数量也就是
这里面的'1'
#keras隐藏了卷积核数量的输入数量的参数输入
如果你熟练使用tensorflow,你可以发现,就是它的那个卷积核的数量其实是可以求出来的,所以隐藏起来是没有问题的。
stddev参数是标准差,只是一种初始数据的手段,keras帮我们做的很好了。
当然,keras肯定提供了其他初始数据的手段,我们会在后面提到。
因为我们了解梯度下降法的尿性,不同初始位置,其带来的优化效果大概率是不一样的,这是因为,我们的网络总是不可避免的存在局部极小。
#keras影藏了偏置值的设定
继续再看,tf(tensorflow简称)中,我们还需要添加偏置值,在keras中得到了隐藏
#keras默认了strides参数的设定[1,1,1,1]
#keras固定了图像数据的输入风格,这样有好处,也有坏处,具体的自己品,主要是针对个人的编程风格可能会造成一些意义的破坏
[]
3.为了让代码看起来更像是一个卷积网络
我们还是比较喜欢一个单层的卷积网络是这样的格式:
当然Relu()来自于Layers模块
4.网络分析(全连接分析)
tf的表达过程如下:
keras的表达过程如下:
#keras可以自动计算卷积神经网络池化后输出的神经元的个数
通过Flatten()函数,它会将数据扁平化,也就是将一个[imgNums,channels,row,col]转化为[imgNums*channels*row*col]这样一个向量
我们来看一下输出的结果
我们来算一下tf池化之后的输出结果是多少?
卷积+relu之后
28*28*32
池化之后
14*14*32 = 6272
所以你看扁平化函数Flutton是多牛逼了,自己算了!卧槽
#keras根据生成的神经元个数自动生成权值矩阵
更扯淡的是,它能自己添加W矩阵,也就是说你只要告诉它这一层(全连接层)你要多少个神经元,卧槽????
如果你在tf中,你要产生128个神经元,那你就就得生成一个
W = [6272,128]
的权值矩阵!!!
比如你有数据x = [batchSize,6272]
matmul(x,W) = [batchSize,128]
以下是keras的输出
这样一个轻轻松松的两行代码,我需要多少行tf来写?
嗯,心态炸了吧~~!!
5.代价过程分析
代价,添加优化器..
傻瓜式操作...
6.验证过程分析
keras代码:
tf代码:
...呵呵=。=
总而言之...
keras...巨爽!