CNN示功图分类器(第一版)

CNN进行示功图分类

图片存放在12个文件夹里面,一共12个类,相同类别的图片存在放在同一个文件夹中。整个模型的建立过程分为数据读入,使用批量生成器生成训练集,建模训练。

数据读入

使用os自带的文件读入机制,先读入每一个文件夹的路径,一共得到12个文件夹路径,再通过每一个文件夹路径,将这个文件夹下的图片读入到一个列表里。

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
import os
from keras.utils.np_utils  import to_categorical
from keras.models import Sequential
from keras.layers.core import Dense ,Dropout, Flatten
from keras.callbacks import EarlyStopping
from keras.layers import Conv2D
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split

import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
config = tf.ConfigProto(allow_soft_placement = True)
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = 0.5)
config.gpu_options.allow_growth = True
 
sess0 = tf.InteractiveSession(config = config)


path_1=r'C:\Users\22167\Desktop\Machine Learnning Datasets\Diagram_Train_CNN'
file1=os.listdir(path_1)
labels = [os.path.join(path_1,i) for i in file1]

image_routes=[]#存储训练集的图片路径
image_labels=[]#存储对应的标签
for i in range(len(labels)):
    for filename in os.listdir(labels[i]):      
        image_routes.append(os.path.join(labels[i], filename))
        image_labels.append(i)
n_classes = len(set(labels)) #得到图片类别数量
image_labels = to_categorical(image_labels, n_classes)  #进行独热编码

批量加载

由于图片数量太多,无法一次性读入内存进行训练,不然会显示内存错误,采用批量加载,一边读入图片到内存,一边训练,,这样的训练方式节省了内存,但是时间消耗大,而且对于训练集的覆盖率没有全部读取到内存再训练这种方式高。

def batchgen(image_routes_train,batch_size,image_size_rows,image_size_cols):#建立批量加载图片的生成器
    batch_images = np.zeros((batch_size,image_size_rows,image_size_cols,4))#储存加载的图片数字矩阵
    batch_labels = np.zeros((batch_size,len(labels)))#储存每个类别
    i=0
    while True:
        n=0
        while n<batch_size:  #定义每一个批次加载的图片的数量
            #i=np.random.randint(len(image_routes_train))
            if(i>=len(image_routes_train)):
                i=0
            img =mpimg.imread(image_routes_train[i])
            img=np.array(img)
            batch_images[n]=img
            batch_labels[n]=image_labels_train[i]
            n=n+1
            i=i+1
        yield batch_images, batch_labels #返回训练集的生成器  

建模训练

使用keras的fit_generator进行训练,将刚才的批量生成器添加到模型训练。

#定义训练集,测试集合和其他超参数
image_routes_train,image_routes_test,image_labels_train,image_labels_test = train_test_split(image_routes,image_labels,test_size=0.3)

input_shape = (190,400,4)
batch_size = 8
n_epochs =4

steps_per_epoch=round(len(image_routes_train)/batch_size) #定义内一个e_pochs训练多少个批次
validation_steps=round(len(image_routes_test)/batch_size) #定义每一次测试,测试多少个批次

train_generator = batchgen(image_routes_train,batch_size,190,400)
val_generator = batchgen(image_routes_test,batch_size,190,400)


callbacks = [EarlyStopping(monitor='val_accuracy', patience=5)]


#使用fit_generator进行训练
model_batch = Sequential()

model_batch.add(Conv2D(16, kernel_size=(4,4), activation = 'relu', input_shape=input_shape))
model_batch.add(Conv2D(32, kernel_size=(4,4), activation='relu' ))


model_batch.add(Flatten())  #卷积层链接全连接层需要展平

model_batch.add(Dense(16, activation='relu'))

model_batch.add(Dense(n_classes, activation='softmax'))

opt = Adam()
model_batch.compile(loss='categorical_crossentropy',optimizer=opt, metrics=['accuracy'])



model_batch.fit_generator(train_generator, steps_per_epoch=steps_per_epoch, epochs=n_epochs)

模型训练完成后,发现测试效果并不理想,准确率在90%左右波动。
后面准备从,特征降维,更换神经网络,或者数据集方面去寻找解决方案。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值