使用Keras提供的VGG16來提取feature

2021-09-11 07:15:26 字數 2960 閱讀 3796

直接上code:

import os

import h5py

from tqdm import tqdm

import tensorflow as tf

from tensorflow.keras.preprocessing import image

from tensorflow.keras.models import model

import numpy as np

os.environ[

"cuda_visible_devices"]=

"0"gpu_options = tf.gpuoptions(allow_growth=

true

)sess = tf.session(config=tf.configproto(gpu_options=gpu_options)

)def

k_make_model()

: base_model = vgg16(weights=

'imagenet'

, include_top=

false

) model = model(inputs=base_model.

input

, outputs=base_model.get_layer(

'block5_conv3'

).output)

return model

defk_extract_images

(target_data, output_data, mode)

: output_data = os.path.join(output_data,

'k-vgg19-%s.h5'

%(mode)

)if mode==

'test'

or mode==

'test-dev'

: mode_year =

2015

else

: mode_year =

2014

target_data = os.path.join(target_data,

'%s%d'

%(mode, mode_year)

)

hdf5_file = h5py.file(output_data,

'w')

file_list =

sorted

(os.listdir(target_data)

) nb_images =

len(file_list)

shape_att =

(nb_images,14,

14,512)

shape_id =

(nb_images,1)

hdf5_att = hdf5_file.create_dataset(

'att'

, shape_att, dtype=

'float32'

) hdf5_id = hdf5_file.create_dataset(

'id'

, shape_id, dtype=

'int64'

) model=k_make_model(

) img_id_list =

for i,

file

inenumerate

(tqdm(file_list)):

img = image.load_img(os.path.join(target_data,

file

), target_size=

(224

,224))

img_data = image.img_to_array(img)

img_data = np.expand_dims(img_data, axis=0)

img_data = preprocess_input(img_data)

feature = model.predict(img_data)

img_id =

int(

file

.split(

'.')[0

].split(

'_')[-

1]) hdf5_att[i]

= feature

hdf5_id[i]

= img_id

hdf5_file.close(

)

以上code是貧僧用來提取vqa 1.0版的feature的**,注意是在jupyter notebook中跑的,所以如果要換成以指令碼形式來跑的話要稍微修改下。

建立模型:

def

k_make_model()

: base_model = vgg16(weights=

'imagenet'

, include_top=

false

) model = model(inputs=base_model.

input

, outputs=base_model.get_layer(

'block5_conv3'

).output)

return model

base_model選擇模型,然後通過outputs=base_model.get_layer('block5_conv3').output)設定從哪一層得到feature。

通過img = image.load_img(os.path.join(target_data, filename), target_size=(224, 224))來讀取(這裡keras封裝好了對的預處理,點讚)並進行變形。最後用feature = model.predict(img_data)獲取feature。

keras構建以vgg16為模板的模型

構建模型 model vgg vgg16 include top false,weights imagenet inpute shape 48,48,3 for layer in model vgg.layers layer.trainable false model flatten name fl...

VGG16模型理解

vgg16作為很入門的cnn網路,同時也有很多基於vgg16的改進網路,比如用於語義分割的segnet等。1 輸入224x224x3的,經過64個卷積核的兩次卷積後,採用一次pooling。經過第一次卷積後,c1有 3x3x3 個可訓練引數 2 之後又經過兩次128的卷積核卷積之後,採用一次pool...

VGG16學習筆記

vgg16 一 摘要 二 convnet的配置 所有隱藏層之後,都配有relu rectified linear uint 修正線性單元 vgg 16中的16指的是在這個網路中包含16個卷積層和全連線層。此外還有vgg 19,由於vgg 16和vgg 19的表現幾乎誤無差,且vgg 16的引數較vg...