使用mobilenet训练自己的数据

来源:互联网 发布:提高淘宝店铺流量 编辑:程序博客网 时间:2024/06/05 07:10

使用mobilenet训练自己的数据

实现背景:keras+ tensorflow

一、数据预处理文件:car2626data.py

#coding:utf-8  import os  import numpy as np  import cv2import pdb  def load_data():      x_train = np.empty((263171,3,224,224),dtype="float32")      y_train = np.empty((263171,),dtype="uint8")    x_test = np.empty((9940,3,224,224),dtype="float32")     y_test = np.empty((9940,),dtype="uint8")    i = 0    j = 0    for line in open('/home/zhanghh/train_label_year.txt'):        ss = line.split(' ')        ori_img = "/home/zhanghh/data/" + ss[0]#        pdb.set_trace()        img1 = cv2.imread(ori_img)        img2 = cv2.resize(img1,(224,224),interpolation=cv2.INTER_CUBIC)        arr = np.asarray(img2,dtype="float32")        x_train[i,:,:,:] = [arr[:,:,0],arr[:,:,1],arr[:,:,2]]#        pdb.set_trace()        y_train[i] = int(ss[-1])        i+=1    y_train = np.reshape(y_train,(len(y_train),1))    for line in open('/home/zhanghh/test_label_year.txt'):        nn = line.split(' ')        or_img = "/home/zhanghh/data/" + nn[0]##把图像resize到224*224大小        img3 = cv2.imread(or_img)        img4 = cv2.resize(img3,(224,224),interpolation=cv2.INTER_CUBIC)        arr = np.asarray(img4,dtype="float32")        x_test[j,:,:,:] = [arr[:,:,0],arr[:,:,1],arr[:,:,2]]        y_test[j] = int(nn[-1])        j+=1        y_test = np.reshape(y_test,(len(y_test),1))#change channels last = 'tf'    x_train = x_train.transpose(0,2,3,1)    x_test = x_test.transpose(0,2,3,1)    return (x_train,y_train),(x_test,y_test)  

二、mobilenet模型架构文件:mobilenet.py

# coding: utf-8from keras.models import Sequential, Modelfrom keras.layers import Dense, Activation, Flatten, Input, BatchNormalization, AveragePooling2Dfrom keras.layers import Conv2D, SeparableConv2Dclass MobileNet():    def mobile_block(self, filter_1, filter_2):        model = self.model        model.add(SeparableConv2D(filter_1,kernel_size=(3,3), strides=(1,1),padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))        model.add(Conv2D(filter_1,kernel_size=(1,1),strides=(1,1), padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))        model.add(SeparableConv2D(filter_2, kernel_size=(3,3), strides=(2,2),padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))        model.add(Conv2D(filter_2 * 2,kernel_size=(1,1),strides=(1,1), padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))    def final_conv_block(self):        model = self.model        model.add(SeparableConv2D(512,kernel_size=(3,3), strides=(2,2),padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))        model.add(Conv2D(1024,kernel_size=(1,1),strides=(1,1), padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))        model.add(SeparableConv2D(1024,kernel_size=(3,3), strides=(1,1),padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))        model.add(Conv2D(1024,kernel_size=(1,1),strides=(1,1), padding='same'))        model.add(BatchNormalization())        model.add(Activation('relu'))    def separable_filters(self):        model = self.model        for i in range(5):            model.add(SeparableConv2D(512,kernel_size=(3,3), strides=(1,1),padding='same'))            model.add(BatchNormalization())            model.add(Activation('relu'))            model.add(Conv2D(512,kernel_size=(1,1),strides=(1,1), padding='same'))            model.add(BatchNormalization())            model.add(Activation('relu'))        def pool_and_classify(self):        model = self.model        model.add(AveragePooling2D(pool_size=(7,7),strides=(1,1)))        model.add(Flatten())        model.add(Dense(2626)) #按照自己的分类数目进行修改Dense()              model.add(Activation('softmax'))    def __init__(self, size=(224,224,3)):        self.create(size)    def create(self, size):        self.model = Sequential()        self.model.add(Conv2D(32,kernel_size=(3,3),strides=(2,2), padding='same', input_shape=size))        self.mobile_block(32,64)                  self.mobile_block(128,128)        self.mobile_block(256,256)        self.separable_filters()        self.final_conv_block()        self.pool_and_classify()

三、运行文件:mobile_cnn.py

from __future__ import print_functionimport kerasimport car2626dataimport mobilenetfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activation, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom mobilenet import MobileNetbatch_size = 128num_classes = 2626epochs = 95# The data, shuffled and split between train and test sets:(x_train, y_train), (x_test, y_test) = car2626data.load_data()print('x_train shape:', x_train.shape)print(x_train.shape[0], 'train samples')print(x_test.shape[0], 'test samples')# Convert class vectors to binary class matrices.y_train = keras.utils.to_categorical(y_train, num_classes)y_test = keras.utils.to_categorical(y_test, num_classes)MODEL = MobileNet()# initiate RMSprop optimizeropt = keras.optimizers.rmsprop(lr=0.0004, decay=1e-6)# Let's train the model using RMSpropMODEL.model.compile(loss='categorical_crossentropy',              optimizer=opt,              metrics=['accuracy'])x_train /= 255x_test /= 255MODEL.model.fit(x_train, y_train,          batch_size=batch_size,          epochs=epochs,          verbose=1,          validation_data=(x_test, y_test))score = MODEL.model.evaluate(x_test, y_test, verbose=0)print('Test loss:', score[0])print('Test accuracy:', score[1])MODEL.model.save_weights('mobilenet_car2626_model.h5')
2 0
原创粉丝点击