红联Linux门户
Linux帮助

keras(Ubuntu14.04,python2.7)安装及用keras从本地中读取图片

发布时间:2017-04-05 15:29:41来源:linux网站作者:lygo
第一部分:安装
由于我的电脑之前已经已经配置好了caffe,因此有关python的一切相关包都已经安装完成。因此,即使不用Anaconda安装依然很简单。
sudo pip install tensorflow
sudo pip install keras
测试:
python
from keras.models import Sequential
 
第二部分:如何用keras从本地中读取图片,并做一个二分类的神经网络,直接贴出代码:
# coding=utf-8
##
import os   ##和文件目录相关的都用到该模块"""  
from PIL import Image  ##python imaging library""" 
import numpy as np
#导入各种用到的模块组件
#from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.advanced_activations import PReLU
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils
def __getnum__(path):         ##统计样本数目的函数
fm=os.listdir(path)
i=0
for f in fm:           ##对于在fm中的文件
i+=1
return i      
def load_data(path,count):     ##数据转换函数
data = np.empty((count,100,100,3),dtype="float32")   
label = np.empty((count,),dtype="int") 
imgs = os.listdir(path)  
num = len(imgs) 
for i in range(num):  
img = Image.open(path+imgs[i])  
arr = np.asarray(img,dtype="float32")
data[i,:,:,:] = arr     
##print i
if i<num/2:             ##前一半label为0,后一部分数据label为1
label[i] = int(0)  
else:  
label[i] = int(1) 
return data,label
###############
#开始建立CNN模型
###############
#生成一个model
def __CNN__(testdata,testlabel,traindata,trainlabel):
model = Sequential()
#第一个卷积层,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。
model.add(Convolution2D(20 , 5 , 5, border_mode='valid',input_shape=(100,100,3))) 
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(MaxPooling2D(pool_size=(2, 2)))
#第二个卷积层,30个卷积核,每个卷积核大小5*5。
#采用maxpooling,poolsize为(2,2)
model.add(Convolution2D(20 , 3 , 3, border_mode='valid'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#第三个卷积层,16个卷积核,每个卷积核大小3*3
#激活函数用tanh
#采用maxpooling,poolsize为(2,2)
model.add(Convolution2D(16 , 3 , 3, border_mode='valid')) 
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, init='normal'))
model.add(Activation('relu'))
#Softmax分类,输出是4类别
model.add(Dense(2, init='normal'))
model.add(Activation('softmax'))
####训练模型
#使用SGD + momentum冲量
sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd,metrics=['accuracy'])
#开始训练, show_accuracy在每次迭代后显示正确率 。  batch_size是每次带入训练的样本数目, nb_epoch 是迭代次数,  shuffle 是打乱样本随机。  
model.fit(traindata, trainlabel, batch_size=20,epochs=100)
#设置测试评估参数,用测试集样本
model.evaluate(testdata, testlabel, batch_size=20)
############
#主模块
############
trainpath = '/home/lyyang/keras/data/train/'
testpath = '/home/lyyang/keras/data/test/'
testcount=__getnum__(testpath)
traincount=__getnum__(trainpath)
#print testcount
#print traincount
testdata,testlabel= load_data(testpath,testcount)
traindata,trainlabel= load_data(trainpath,traincount)
#print testlabel.shape
#print testlabel
#print trainlabel.shape
#print trainlabel
#label为0~1共2个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数
testlabel = np_utils.to_categorical(testlabel, 2)      
trainlabel = np_utils.to_categorical(trainlabel, 2)
__CNN__(testdata, testlabel, traindata, trainlabel)
使用猫狗数据进行分类,数据可以在kaggle网站上下载。
运行的话:
python
python   ***.py 
不过,我没有配置python 的 IDE,感觉写大的project还是不太方便。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/29755.html