直接上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...