对于通道数为一的图像:
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function
import os
from PIL import Image
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,Conv2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils
from six.moves import range
#数据预处理
#读取文件夹mnist下的42000张图片(灰度图)
def load_data():
data = np.empty((2000,28,28,1),dtype="float32") 注意:::: 这里2000是图像数,数目不对时,会报错
label = np.empty((2000,),dtype="uint8")
imgs = os.listdir("./mnist")
num = len(imgs)
for i in range(num):
print(i)
img = Image.open("./mnist/"+imgs[i])
arr = np.asarray(img,dtype="float32")
print(arr.shape)
data[i,:,:,0] = arr
#print(data.shape)
label[i] = int(imgs[i].split('.')[0])
#print(label[i])
return data,label
def load_testData():
testImg = Image.open('testNum1.jpg')
imgArr = np.asarray(testImg,dtype="float32")
testData = np.empty((1,28,28,1),dtype="float32")
testData[0,:,:,0] = imgArr
return testData
if __name__ == '__main__':
testData = load_testData()
#保存模型数据的文件
filename = 'mnistCnnTrain.h5'
#加载数据
data, label = load_data()
#print(data.shape[0], ' samples')
#label为0~9共10个类别,转化格式
label = np_utils.to_categorical(label, 10)
#print(label)
#=======================================
#=======================================
#=======================================
###############
#开始建立CNN模型
###############
#生成一个model
model = Sequential()
#第一个卷积层,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。
#激活函数用tanh
#你还可以在model.add(Activation('tanh'))后加上dropout的技巧: model.add(Dropout(0.5))
#model.add(Convolution2D(nb_filter=4,nb_row=5,nb_col=5,border_mode='valid',input_shape=(28,28,1)))
model.add(Conv2D(4, (5, 5), padding='valid',input_shape=(28, 28,1), activation='tanh'))
# model.add(Activation('tanh'))
#第二个卷积层,8个卷积核,每个卷积核大小3*3。4表示输入的特征图个数,等于上一层的卷积核个数
model.add(Conv2D(8, (3, 3), padding='valid', activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#第三个卷积层,16个卷积核,每个卷积核大小3*3
model.add(Conv2D(16, (3, 3), padding='valid', activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('tanh'))
#Softmax分类,输出是10类别
model.add(Dense(10))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adadelta',metrics=["accuracy"])
2:图像通道数为三的时候
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function
import os
from PIL import Image
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,Conv2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils
from six.moves import range
import tensorflow as tf
dirtrain='/home/4T/2018_runpu_data/原始数据/河北数据4_20180409'
def load_data(file_dir):
j=0
i=0
data = np.empty((200000,1200,2300,3),dtype="float32")
label = np.empty((200000,),dtype="uint8")
for file in os.listdir(file_dir):
for file1 in os.listdir(file_dir+'/'+file):
for file2 in os.listdir(file_dir+'/'+file+'/'+file1):
for file3 in os.listdir(file_dir+'/'+file+'/'+file1+'/'+file2):
dir=file_dir+'/'+file+'/'+file1+'/'+file2 +'/'+ file3
if 'C.jpg' in file3:
#print(Image.open(dir))
try:
image=Image.open(dir)
except IOError:
print(dir)
print ("Error: 没有找到文件或读取文件失败")
else:
if image.mode=='RGB':
#print(dir)
img = Image.open(dir)
img = img.resize((1200, 2300),Image.ANTIALIAS)
arr = np.asarray(img,dtype="float32")
data[i,:,:,:] = arr
label[i] = int(0)
i=i+1
else:
j=j+1
elif 'CB.jpg' in file3:
#print(Image.open(dir))
try:
image=Image.open(dir)
except IOError:
print(dir)
print ("Error: 没有找到文件或读取文件失败")
else:
if image.mode=='RGB':
#print(dir)
img = Image.open(dir)
img = img.resize((1200, 2300),Image.ANTIALIAS)
arr = np.asarray(img,dtype="float32")
data[i,:,:,:] = arr
label[i] = int(3)
i=i+1
else:
j=j+1
elif 'CA.jpg' in file3:
#print(Image.open(dir))
try:
image=Image.open(dir)
except IOError:
print(dir)
print ("Error: 没有找到文件或读取文件失败")
else:
if image.mode=='RGB':
#print(dir)
img = Image.open(dir)
img = img.resize((1200, 2300),Image.ANTIALIAS)
arr = np.asarray(img,dtype="float32")
data[i,:,:,:] = arr
label[i] = int(1)
i=i+1
else:
j=j+1
elif('C.jpg' not in file3) and ('CA.jpg' not in file3)and ('CB.jpg' not in file3)and ('.jpg' in file3):
#print(Image.open(dir))
try:
image=Image.open(dir)
except IOError:
print(dir)
print ("Error: 没有找到文件或读取文件失败")
else:
if image.mode=='RGB':
#print(dir)
img = Image.open(dir)
img = img.resize((1200, 2300),Image.ANTIALIAS)
arr = np.asarray(img,dtype="float32")
data[i,:,:,:] = arr
label[i] = int(2)
#print(label[i])
i=i+1
else:
j=j+1
else:
j=j+1
print(i)
return data,label
if __name__ == '__main__':
#保存模型数据的文件
filename = 'mnistCnnTrain.h5'
#加载数据
data, label = load_data(dirtrain)
#print(data.shape[0], ' samples')
#label为0~9共10个类别,转化格式
print(len(label))
label = np_utils.to_categorical(label, 4)
#生成一个model
filename = 'mnistCnn.h5'
model = Sequential()
#第一个卷积层,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。
#激活函数用tanh
#你还可以在model.add(Activation('tanh'))后加上dropout的技巧: model.add(Dropout(0.5))
#model.add(Convolution2D(nb_filter=4,nb_row=5,nb_col=5,border_mode='valid',input_shape=(28,28,1)))
model.add(Conv2D(4, (5, 5), padding='valid',input_shape=(600, 400,3), activation='tanh'))
# model.add(Activation('tanh'))
#第二个卷积层,8个卷积核,每个卷积核大小3*3。4表示输入的特征图个数,等于上一层的卷积核个数
model.add(Conv2D(8, (3, 3), padding='valid', activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#第三个卷积层,16个卷积核,每个卷积核大小3*3
model.add(Conv2D(16, (3, 3), padding='valid', activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#=======================================
#=======================================
#=======================================
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('tanh'))
#Softmax分类,输出是10类别
model.add(Dense(4))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adadelta',metrics=["accuracy"])
model.fit(data, label, batch_size=100,nb_epoch=1,shuffle=True,verbose=1,validation_split=0.2)
model.save(filename)