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