keras用vgg16预训练的参数训练自己数据集

1.下载vgg16模型预训练权重,将之放到~/.keras/model/下面,这样在keras导入vgg16的时候就不会联网下载,因为某些原因国内下载不了。。

2.通过vgg16来提取特征,不用输出层

通过vgg获取数据集特征,提取离线处理之后后面直接用,数据集和上次一样的车辆数据集一样,前面博文有说

import keras
from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
import numpy as np

model = VGG16(weights='imagenet', include_top=False)

# img_path = '17.png'
# img = image.load_img(img_path)
# x = image.img_to_array(img)
# x = np.expand_dims(x, axis=0)
# x = preprocess_input(x)

# features = model.predict(x)
# print features
# dimensions of our images.
img_width, img_height = 64, 64

train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = 4000  #4000
nb_validation_samples = 2000  #2000

batch_size = 1

datagen = ImageDataGenerator()

generator = datagen.flow_from_directory(
        'data/train',
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode=None,  # this means our generator will only yield batches of data, no labels
        shuffle=False)  # our data will be in order, so all first 1000 images will be cats, then 1000 dogs
# the predict_generator method returns the output of a model, given
# a generator that yields batches of numpy data
print "train begin\n"

bottleneck_features_train = model.predict_generator(generator, nb_train_samples)
# save the output as a Numpy array
np.save(open('bottleneck_features_train.npy', 'w'), bottleneck_features_train)
print "train over\n"


generator = datagen.flow_from_directory(
        'data/validation',
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode=None,  # this means our generator will only yield batches of data, no labels
        shuffle=False)
bottleneck_features_validation = model.predict_generator(generator, nb_validation_samples)
np.save(open('bottleneck_features_validation.npy', 'w'), bottleneck_features_validation)


训练输出层部分

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K
import h5py
import numpy as np
train_data = np.load(open('bottleneck_features_train.npy'))
# the features were saved in order, so recreating the labels is easy
train_labels = np.array([0] * 2000 + [1] * 2000)
print train_data.shape[1:]
validation_data = np.load(open('bottleneck_features_validation.npy'))
validation_labels = np.array([0] * 1000 + [1] * 1000)
print validation_data.shape

model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# model = Sequential()
# model.add(Flatten(input_shape=train_data.shape[1:]))
# model.add(Dense(256, activation='relu'))
# model.add(Dropout(0.5))
# model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit(train_data, train_labels,
          nb_epoch=50, batch_size=32,
          validation_data=(validation_data, validation_labels) )
#model.save_weights('bottleneck_fc_model.h5')
model.save('My_vgg.h5')


测试数据

import keras
from keras.models import load_model
from keras.models import Sequential

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras import backend as K
#import cv2
import numpy as np
import h5py
import os

#model = Sequential()
modelVGG = VGG16(weights='imagenet', include_top=False)

modelMY = load_model('My_vgg.h5')
num_test=44

count=0
for i in range(num_test):
    #path='pic/'+str(i)+'.png';
    #path='17.png'
    #path='data/validation/veh/'+str(i)+'.png'
    path='pic/'+str(i)+'.png'
    img = load_img(path)  # this is a PIL image
    x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)

    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    features = modelVGG.predict(x)
    # print i
    #print i,modelMY.predict_proba(features)
    if (modelMY.predict_proba(features) > 0.7 ):
        print i

print count*1.0/num_test
    # print '\n'

             



  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值