使用mobilenet训练自己的数据
2017-05-08 22:01
85 查看
使用mobilenet训练自己的数据
实现背景:keras+ tensorflow
一、数据预处理文件:car2626data.py
#coding:utf-8 import os import numpy as np import cv2 import 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-8 from keras.models import Sequential, Model from keras.layers import Dense, Activation, Flatten, Input, BatchNormalization, AveragePooling2D from keras.layers import Conv2D, SeparableConv2D class 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_function import keras import car2626data import mobilenet from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Conv2D, MaxPooling2D from mobilenet import MobileNet batch_size = 128 num_classes = 2626 epochs = 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 optimizer opt = keras.optimizers.rmsprop(lr=0.0004, decay=1e-6) # Let's train the model using RMSprop MODEL.model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) x_train /= 255 x_test /= 255 MODEL.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')
相关文章推荐
- 使用caffe训练自己的图像数据
- 使用py-faster-rcnn训练自己的数据
- mxnet实战笔记(1) - 使用自己的图片数据训练CNN模型
- 使用lenet模型训练及预测自己的图片数据
- 使用Tensorflow训练自己的分割数据
- Caffe上训练使用自己的数据
- Caffe上训练使用自己的数据
- mxnet 使用自己的图片数据训练CNN模型
- 【YOLO学习】使用YOLO v2训练自己的数据
- 【YOLO学习】使用YOLO v2训练自己的数据
- 使用caffe训练自己的数据
- caffe学习笔记3:使用caffe对自己的图像数据进行训练和测试
- 使用YOLO训练自己的数据样本经验总结
- 使用Faster R-CNN训练自己的数据
- Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning
- 【深度学习】笔记6:使用caffe中的CIFAR10网络模型和自己的图片数据训练自己的模型(步骤详解)
- Matconvnet 训练自己的数据(使用现有模型)
- 深度学习文章5:使用caffe对自己的图像数据进行训练并测试
- darknet使用detector训练与测试自己的数据
- Caffe初试(三)使用caffe的cifar10网络模型训练自己的图片数据