直接應用原模型預測
導入模型
導入函數:
導入代碼
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模型一樣,都可以被訓練。
未完待續~