keras基于tensorflow后端---处理自己的数据

本文介绍了一种使用卷积神经网络(CNN)进行手写数字识别的方法。该模型能够处理灰度图和彩色图两种情况,通过多层卷积和池化操作提取图像特征,并最终实现对数字的有效分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于通道数为一的图像:

# -*- 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)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值