中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

keras如何實現VGG16

發布時間:2020-07-08 11:44:49 來源:億速云 閱讀:167 作者:清晨 欄目:開發技術

小編給大家分享一下keras如何實現VGG16,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

from keras.applications.vgg16 import VGG16#直接導入已經訓練好的VGG16網絡
from keras.preprocessing.image import load_img#load_image作用是載入圖片
from keras.preprocessing.image import img_to_array
from keras.applications.vgg16 import preprocess_input
from keras.applications.vgg16 import decode_predictions
 
model = VGG16()
image = load_img('D:\\photo\\dog.jpg',target_size=(224,224))#參數target_size用于設置目標的大小,如此一來無論載入的原圖像大小如何,都會被標準化成統一的大小,這樣做是為了向神經網絡中方便地輸入數據所需的。
image = img_to_array(image)#函數img_to_array會把圖像中的像素數據轉化成NumPy中的array,這樣數據才可以被Keras所使用。
#神經網絡接收一張或多張圖像作為輸入,也就是說,輸入的array需要有4個維度: samples, rows, columns, and channels。由于我們僅有一個 sample(即一張image),我們需要對這個array進行reshape操作。
image = image.reshape((1,image.shape[0],image.shape[1],image.shape[2]))
image = preprocess_input(image)#對圖像進行預處理
y = model.predict(image)#預測圖像的類別
label = decode_predictions(y)#Keras提供了一個函數decode_predictions(),用以對已經得到的預測向量進行解讀。該函數返回一個類別列表,以及類別中每個類別的預測概率,
label = label[0][0]
print('%s(%.2f%%)'%(label[1],label[2]*100))
# print(model.summary())
from keras.models import Sequential
from keras.layers.core import Flatten,Dense,Dropout
from keras.layers.convolutional import Convolution2D,MaxPooling2D,ZeroPadding2D
from keras.optimizers import SGD
import numpy as np
 
from keras.preprocessing import image
from keras.applications.imagenet_utils import preprocess_input, decode_predictions
import time
from keras import backend as K
K.set_image_dim_ordering('th')
def VGG_16(weights_path=None):
  model = Sequential()
 
  model.add(ZeroPadding2D((1, 1), input_shape=(3, 224, 224)))
  model.add(Convolution2D(64, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(64, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(128, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(128, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(256, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(256, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(256, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(Flatten())
  model.add(Dense(4096, activation='relu'))
  model.add(Dropout(0.5))
  model.add(Dense(4096, activation='relu'))
  model.add(Dropout(0.5))
  model.add(Dense(1000, activation='softmax'))
 
  if weights_path:
    model.load_weights(weights_path,by_name=True)
 
  return model
 
model = VGG_16(weights_path='F:\\Kaggle\\vgg16_weights.h6')
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd, loss='categorical_crossentropy')
 
t0 = time.time()
img = image.load_img('D:\\photo\\dog.jpg', target_size=(224, 224))
x = image.img_to_array(img) # 三維(224,224,3)
x = np.expand_dims(x, axis=0) # 四維(1,224,224,3)#因為keras要求的維度是這樣的,所以要增加一個維度
x = preprocess_input(x) # 預處理
print(x.shape)
y_pred = model.predict(x) # 預測概率
 
t1 = time.time()
 
print("測試圖:", decode_predictions(y_pred)) # 輸出五個最高概率(類名, 語義概念, 預測概率)
print("耗時:", str((t1 - t0) * 1000), "ms")

這是兩種不同的方式,第一種是直接使用vgg16的參數,需要在運行時下載,第二種是我們已經下載好的權重,直接在參數中輸入我們的路徑即可。

補充知識:keras加經典網絡的預訓練模型(以VGG16為例)

我就廢話不多說了,大家還是直接看代碼吧~

# 使用VGG16模型
from keras.applications.vgg16 import VGG16
print('Start build VGG16 -------')
 
# 獲取vgg16的卷積部分,如果要獲取整個vgg16網絡需要設置:include_top=True
model_vgg16_conv = VGG16(weights='imagenet', include_top=False)
model_vgg16_conv.summary()
 
# 創建自己的輸入格式
# if K.image_data_format() == 'channels_first':
#  input_shape = (3, img_width, img_height)
# else:
#  input_shape = (img_width, img_height, 3)
 
input = Input(input_shape, name = 'image_input') # 注意,Keras有個層就是Input層
 
# 將vgg16模型原始輸入轉換成自己的輸入
output_vgg16_conv = model_vgg16_conv(input)
 
# output_vgg16_conv是包含了vgg16的卷積層,下面我需要做二分類任務,所以需要添加自己的全連接層
x = Flatten(name='flatten')(output_vgg16_conv)
x = Dense(4096, activation='relu', name='fc1')(x)
x = Dense(512, activation='relu', name='fc2')(x)
x = Dense(128, activation='relu', name='fc3')(x)
x = Dense(1, activation='softmax', name='predictions')(x)
 
# 最終創建出自己的vgg16模型
my_model = Model(input=input, output=x)
 
# 下面的模型輸出中,vgg16的層和參數不會顯示出,但是這些參數在訓練的時候會更改
print('\nThis is my vgg16 model for the task')
my_model.summary()

看完了這篇文章,相信你對keras如何實現VGG16有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴仁县| 东宁县| 新干县| 新安县| 库车县| 新营市| 蕉岭县| 漳浦县| 新干县| 辉南县| 边坝县| 盖州市| 景东| 涟水县| 华坪县| 寿阳县| 石棉县| 东丽区| 苏尼特左旗| 蓝田县| 玛沁县| 定西市| 宁蒗| 海原县| 伊通| 昌都县| 安康市| 江川县| 华池县| 若尔盖县| 普宁市| 威海市| 灵丘县| 健康| 成都市| 长汀县| 元氏县| 东丽区| 红原县| 红安县| 宜川县|