原文地址:http://blog.youkuaiyun.com/hjimce/article/details/49095199
作者:hjimce
keras与torch7的使用非常相似,是最近才火起来的深度学习开源库,底层是用了theano。keras可以说是python版的torch7,对于快速构建CNN模型非常方便。同时也包含了一些最新文献的算法,比如Batch Noramlize,文档教程也很全,在官网上作者都是直接给例子浅显易懂,个人感觉非常容易上手。keras也支持保存训练好的参数,然后加载已经训练好的参数,进行继续训练。
一、安装教程。
因为keras是在theano的基础上进行封装的,所以我们需要先安装好theano后,再继续安装keras。theano的安装可以参考我的另外一篇博文,因为我在另外一篇博文中,是在windows环境下搭建theano的,所以这里所讲的keras的安装也是在windows下。
其实如果在ubuntu中,theano没有安装也没关系,只要使用命令:pip install keras。如果顺利的话,系统会帮你把keras所有所需的库都给安装了,包括theano。
windows安装步骤:
1、参考我的另外一篇博文,安装theano,并测试没有问题。
2、使用Anaconda,然后在命令anaconda的命令窗口中输入:pip install keras
这个时候有可能出现h5py安装失败:
那么请到网站:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载h5py。
打开上面的网站,找到h5py:
- # coding=utf-8
- import numpy as np
- #np.random.seed(100)
- from keras.optimizers import SGD
- import os
- import matplotlib.pyplot as plt
- import h5py
- from keras.models import Sequential
- from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
- from keras.layers.core import Dense,Dropout,Activation,Flatten
- from keras.layers.normalization import BatchNormalization
- from keras.optimizers import SGD, Adadelta, Adagrad,RMSprop
- from keras.layers.advanced_activations import PReLU
- from keras.callbacks import ModelCheckpoint,Callback
- class LossHistory(Callback):
- def on_train_begin(self, logs={}):
- self.losses = []
- def on_batch_end(self, batch, logs={}):
- self.losses.append(logs.get('loss'))
- def Net_Mouth():
- keras_model=Sequential()#单支线性网络模型
- #卷积层输出的特征图为20个,卷积核大小为5*5
- keras_model.add(Convolution2D(20, 5, 5,input_shape=(3, 60, 60)))#网络输入每张图片大小为3通道,60*60的图片。
- #激活函数层
- keras_model.add(Activation('relu'))
- #最大池化层
- keras_model.add(MaxPooling2D(pool_size=(2, 2)))
- #卷积层,特征图个数为40,卷积核大小为5*5
- keras_model.add(Convolution2D(40, 5, 5))
- keras_model.add(Activation('relu'))
- keras_model.add(MaxPooling2D(pool_size=(2, 2)))
- keras_model.add(Convolution2D(60, 3, 3))
- keras_model.add(Activation('relu'))
- keras_model.add(MaxPooling2D(pool_size=(2, 2)))
- keras_model.add(Convolution2D(80, 3, 3))
- keras_model.add(Activation('relu'))
- #全连接展平
- keras_model.add(Flatten())
- #全连接层,神经元个数为1000
- keras_model.add(Dense(1000))
- keras_model.add(Activation('relu'))
- keras_model.add(Dense(500))
- keras_model.add(Activation('relu'))
- keras_model.add(Dense(38))
- keras_model.add(Activation('tanh'))
- #采用adam算法进行迭代优化,损失函数采用均方误差计算公式
- keras_model.compile(loss='mean_squared_error', optimizer='adam')
- return keras_model
- keras_model=Net_Mouth()
- #用于保存验证集误差最小的参数,当验证集误差减少时,立马保存下来
- checkpointer =ModelCheckpoint(filepath="mouth.hdf5", verbose=1, save_best_only=True)
- history = LossHistory()
- #训练函数,对于cnn来说,网络的输入x是(nsamples,nchanels,height,width)
- #y的输入是(nsamples,output_dimension)
- keras_model.fit(x, y, batch_size=128, nb_epoch=100,shuffle=True,verbose=2,show_accuracy=True,validation_split=0.1,callbacks=[checkpointer,history])
- # coding=utf-8
- import numpy as np
- from keras.models import Graph
- import numpy as np
- np.random.seed(100)
- import os
- import matplotlib.pyplot as plt
- import h5py
- from keras.models import Graph
- from keras.layers.convolutional import Convolution2D, MaxPooling2D
- from keras.layers.core import Dense,Activation,Flatten, Dropout
- import keras.optimizers
- from keras.callbacks import ModelCheckpoint,Callback
- class LossHistory(Callback):
- def on_train_begin(self, logs={}):
- self.losses = []
- def on_batch_end(self, batch, logs={}):
- self.losses.append(logs.get('loss'))
- #graph 模型,下面的例子是CNN的局部unshared weight 例子
- #用于人脸五官特征点的定位预测,采用五官局部unshared weight
- def Second_Net_Graph():
- keras_model=Graph()
- #网络输入,一张图片3通道,60*60的图片。name表示图模型的节点名称,我们把第一层输入命名为input
- keras_model.add_input(name='input',input_shape=(3,60,60))
- #第一个卷积层节点,我们把它命名为conv1,这一层连接到input节点上,input节点作为输入
- keras_model.add_node(layer=Convolution2D(20, 5, 5),name='conv1',input='input')
- #激活函数节点,我们把它命名为relul,这一节点连接到conv1节点上
- keras_model.add_node(layer=Activation('relu'),name='relul',input='conv1')
- keras_model.add_node(layer=MaxPooling2D(pool_size=(2, 2)),name='pool1',input='relul')
- keras_model.add_node(layer=Convolution2D(40, 5, 5),name='conv2',input='pool1')
- keras_model.add_node(layer=Activation('relu'),name='relu2',input='conv2')
- keras_model.add_node(layer=MaxPooling2D(pool_size=(2, 2)),name='pool2',input='relu2')
- keras_model.add_node(layer=Convolution2D(60, 3, 3),name='conv3',input='pool2')
- keras_model.add_node(layer=Activation('relu'),name='relu3',input='conv3')
- keras_model.add_node(layer=MaxPooling2D(pool_size=(2, 2)),name='pool3',input='relu3')
- #分支,前面是权重共享,单支情况,接着到这里,我们把它分支成几个支路,每个分支用于预测各个五官的特征点位置
- #分支1、这个节点名字为brow_input,连接到pool3上,pool3为输入节点
- keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='brow_input',input='pool3')
- #分支2,节点名称为eye_input,输入节点为pool3
- keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='eye_input',input='pool3')
- #分支3
- keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='nose_input',input='pool3')
- #分支4
- keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='mouth_input',input='pool3')
- #各个分支展平
- keras_model.add_node(layer=Flatten(),name='brow_flatten',input='brow_input')
- keras_model.add_node(layer=Flatten(),name='eye_flatten',input='eye_input')
- keras_model.add_node(layer=Flatten(),name='nose_flatten',input='nose_input')
- keras_model.add_node(layer=Flatten(),name='mouth_flatten',input='mouth_input')
- #各个分支全连接
- keras_model.add_node(layer=Dense(500,activation='relu'),name='brow_dense1',input='brow_flatten')
- keras_model.add_node(layer=Dense(500,activation='relu'),name='eye_dense1',input='eye_flatten')
- keras_model.add_node(layer=Dense(500,activation='relu'),name='nose_dense1',input='nose_flatten')
- keras_model.add_node(layer=Dense(500,activation='relu'),name='mouth_dense1',input='mouth_flatten')
- #各个分支的输出
- keras_model.add_node(layer=Dense(20,activation='tanh'),name='brow_dense2',input='brow_dense1')
- keras_model.add_node(layer=Dense(24,activation='tanh'),name='eye_dense2',input='eye_dense1')
- keras_model.add_node(layer=Dense(18,activation='tanh'),name='nose_dense2',input='nose_dense1')
- keras_model.add_node(layer=Dense(38,activation='tanh'),name='mouth_dense2',input='mouth_dense1')
- #inputs把各个分支得到的向量,按节点的名字,进行排放,然后作为输出
- keras_model.add_output(name='output',inputs=['brow_dense2','nose_dense2','eye_dense2',
- 'mouth_dense2'])
- #优化方法选择adam,损失函数选择均方差
- keras_model.compile(optimizer='adam',loss={'output':'mse'})
- return keras_model
- #读取模型,并进行训练
- def train(data_file='../../h5py/train.h5'):
- print 'readdata'
- f=h5py.File(data_file,'r')
- x=f['data'][:]
- x=np.asarray(x,dtype='float32')
- y=f['label'][:]
- y=np.asarray(y,dtype='float32')
- print x.shape
- print y.shape
- print 'train'
- keras_model=Second_Net_Graph()
- checkpointer =ModelCheckpoint(filepath="graph51point.hdf5", verbose=1, save_best_only=True)
- history = LossHistory()
- history = keras_model.fit({'input':x, 'output':y}, shuffle=True,verbose=2,validation_split=0.1,callbacks=[checkpointer,history])
- train()
个人心得:感觉keras使用很方便,同时底层的源码很很容易读懂,我们要修改算法,可以去读一读底层的源码,学习起来不会像caffe的底层那么麻烦,个人感觉caffe的唯一好处就是有很多公开的model、源码,用起来相当麻烦,keras就不一样了,用python,搞深度学习,轻松许多,可惜cvpr上的一些文献的源码都是用caffe写的。期待keras像torch一样,支持caffe模型导入功能。
**********************作者:hjimce 时间:2015.10.1 联系QQ:1393852684 地址:http://blog.youkuaiyun.com/hjimce 原创文章,版权所有,转载请保留本行信息(不允许删除)