深度学习(十)keras学习笔记

keras学习笔记

原文地址:http://blog.csdn.net/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:

深度学习(十)keras学习笔记_第1张图片

根据根据自己的电脑选择相应的版本,我的电脑是64为系统,python为2.7,所以选择了: h5py-2.5.0-cp27-none-win_amd64.whl。
然后把下载到的h5py文件,放到Anaconda所在的安装目录下:
深度学习(十)keras学习笔记_第2张图片
最后我们在anaconda的命令窗口中输入命令:pip install   h5py-2.5.0-cp27-none-win_amd64.whl 。等h5py安装完后。在重新安装keras输入命令:pip install keras。
深度学习(十)keras学习笔记_第3张图片


上面如果还是安装失败,那么试试升级pip版本,输入:python-m pip install --upgrade pip,把pip的版本升级一下。
二、keras 使用教程
下面贴个简单的例子、更多的例子可以自己到官网的文档教程上看,官网给了很详细的教程,不像caffe的文档那么少。看一下下面例子,松松构建CNN模型。keras为我们提供了两种网络模型.
1、一种是CNN比较常用到的sequential网络结构,调用方法如下:

# 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])
2、图模型,根据节点进行命名连接的一种网络结构

# 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.csdn.net/hjimce   原创文章,版权所有,转载请保留本行信息(不允许删除)

你可能感兴趣的:(深度学习(十)keras学习笔记)