深度學習12-遷移學習+VGG16+cifar10案例

直接應用原模型預測

導入模型

導入函數:
在這裏插入圖片描述
導入代碼

import keras

# 讀入完整的VGG16模型設定
model = keras.applications.vgg16.VGG16(include_top = True, 
                                       weights = 'imagenet', 
                                       input_tensor = None, 
                                       input_shape = None, 
                                       pooling = None, 
                                       classes = 1000) # 所有參數均爲默認值
model.summary()         
model.layers[1].get_weights()                              

整理數據

將數據整理爲模型所需格式

from keras.preprocessing import image
from keras.applications.imagenet_utils import preprocess_input
# 按照模型指定大小載入圖片
img = image.load_img('test.jpg', target_size = (224, 224))
img
import numpy as np

x = image.img_to_array(img) # 轉化爲三維數組(224,224,3)
print(x[:5, :5, 1])
x = np.array([x]) # 轉換爲四維格式(1,224,224,3),也可使用np.expand_dims()
x = preprocess_input(x) # 預處理(減去均值)
print(x[0, :5, :5, 1])

在這裏插入圖片描述

進行預測

y_pred = model.predict(x)# 預測概率

print(len(y_pred[0]))
y_pred[0][:10]]:

from keras.applications.vgg16 import decode_predictions

# 輸出五個最高概率(類名, 語義概念, 預測概率)
for item in decode_predictions(y_pred, top = 5)[0]:
    print("%s, %s, %2.2f%%" % (item[0], item[1], item[2] * 100))

利用原模型做數據處理

用原模型轉換圖像數據

import keras
# 讀取不包括頂層的VGG16模型及權重,這裏可以用input_shape參數指定輸入矩陣尺寸
model = keras.applications.vgg16.VGG16(include_top = False) 
model.summary()

from keras.preprocessing import image

#載入圖片,此處圖片如太小則需要指定大小

img = image.load_img('test.jpg')
img
import numpy as np
from keras.applications.imagenet_utils import preprocess_input

x = image.img_to_array(img) # 轉化爲三維數組(*,*,3)
x = np.array([x]) # 轉換爲四維格式(1,*,*,3),也可使用np.expand_dims()
x = preprocess_input(x) # 預處理(減去均值)
x_trans = model.predict(x)# 利用模型預測的方式得到轉換後的x矩陣
x_trans.shape
x_trans[0,:,:,0]

將VGG16用於cifar10案例

整理數據格式

將原始數據轉換爲符合VGG16要求的格式
cifar10的源圖片爲32 32,使用VGG16處理完畢後會成爲1 1大小,因此根據後續建模處理的需求,可能需要對輸入圖片的大小做事先轉換。

from keras.datasets import cifar10

(X_train, y_train), (X_test, y_test) = cifar10.load_data() 

X_train1 = X_train[:1000]; y_train1 = y_train[:1000]
X_test1 = X_test[:1000]; y_test1 = y_test[:1000]

print('圖像數據格式: ', X_train1.shape)
print("訓練集:%2.0f,測試集:%2.0f" %(X_train1.shape[0], X_test1.shape[0]))

在這裏插入圖片描述

NewSize = 64
from PIL import Image #PIL pakage name is Pillow 
from keras.preprocessing import image

def M_imgpreproc(inmtx):
    return image.img_to_array(Image.fromarray(inmtx).resize((NewSize, 
                                                             NewSize))) 

X_train1.shape#(1000, 32, 32, 3)選擇1000條數據
import numpy as np
X_train2 = np.zeros((X_train1.shape[0], NewSize, NewSize, 3))
for i in range(X_train1.shape[0]):
    X_train2[i] = M_imgpreproc(X_train1[i])

X_train2.shape#(1000, 64, 64, 3)
X_test2 = np.zeros((X_test1.shape[0], NewSize, NewSize, 3))
for i in range(X_test1.shape[0]):
    X_test2[i] = M_imgpreproc(X_test1[i])

利用VGG16模型進行數據處理

import keras
# 讀取不包括頂層的VGG16模型及權重,這裏可以用input_shape參數指定輸入矩陣尺寸
model = keras.applications.vgg16.VGG16(include_top = False) 

import numpy as np
from keras.applications.imagenet_utils import preprocess_input

X = preprocess_input(X_train2) # 預處理(減去均值)

%time X_trans = model.predict(X)# 利用模型預測的方式得到轉換後的x矩陣
X_trans.shape
# 顯示部分轉換後數據
X_trans[0, :, :,6]
# 將原始數據轉換爲[0, 1]區間
X_trans1 = X_trans.astype('float32') / 255
X_test1 = X_test1.astype('float32') / 255

# 類別向量轉爲多分類矩陣
y_train1 = keras.utils.to_categorical(y_train1, 10)
y_test1 = keras.utils.to_categorical(y_test1, 10)

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D

# 建立基於keras的cnn模型
model2 = Sequential()

# 卷積==>最大池化
model2.add(Conv2D(32, X_trans1.shape[1:3], padding = 'same',
                 input_shape = X_trans1.shape[1:])) # 第一層需要指定數據格式
model2.add(Activation('relu'))
model2.add(MaxPooling2D(pool_size = (2, 2)))
model2.add(Dropout(0.25))

# 將數據展平
model2.add(Flatten())
model2.add(Dense(512))
model2.add(Activation('relu'))
model2.add(Dropout(0.5))
model2.add(Dense(10))
model2.add(Activation('softmax'))
model2.compile(loss = 'categorical_crossentropy', 
              optimizer = 'adam', metrics = ['accuracy'])
model2.fit(X_trans1, y_train1, epochs = 100)
X_testtrans = model.predict(preprocess_input(X_test2))

model2.evaluate(X_testtrans.astype('float32') / 255, y_test1)

在原模型的基礎上繼續訓練

Keras的函數式API

網絡層以張量爲參數,並且返回一個張量。
Layer = Dense(64, activation=‘relu’)(input)
基於網絡層返回張量這一事實,網絡層實例可被直接調用。

type(model.layers[0].output)

網絡層可以被依次用來定義一個模型(Model),且此模型同Sequential模型一樣,都可以被訓練。
未完待續~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章