卜若的代码笔记-python系列-神经网络篇-第十三章:keras的使用(和tensorflow进行细致比较)

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...巨爽! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值