VGG16原理
????????VGG16是一個(gè)經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)模型,由牛津大學(xué)計(jì)算機(jī)視覺組(Visual Geometry Group)提出,用于參加2014年的ImageNet圖像分類比賽。VGG16的名稱來(lái)源于網(wǎng)絡(luò)中包含的16個(gè)卷積層,其基本結(jié)構(gòu)如下:
- 輸入層:接收大小為224x224的RGB圖像。
- 卷積層:共13個(gè)卷積層,每個(gè)卷積層使用3x3的卷積核和ReLU激活函數(shù),提取圖像的局部特征。
- 池化層:共5個(gè)池化層,每個(gè)池化層使用2x2的池化核和步長(zhǎng)2,減小特征圖的大小。
- 全連接層:包含2個(gè)全連接層,每個(gè)全連接層包含4096個(gè)神經(jīng)元,用于分類輸出。
- 輸出層:包含一個(gè)大小為1000的全連接層,使用softmax激活函數(shù),生成1000個(gè)類別的概率分布。
?
????????VGG16的主要特點(diǎn)是網(wǎng)絡(luò)結(jié)構(gòu)比較深,且卷積層和池化層的數(shù)量都比較多,使得網(wǎng)絡(luò)可以學(xué)習(xí)到更加高層次的抽象特征。此外,VGG16的卷積層都采用3x3的卷積核,這樣可以保證在不增加計(jì)算量的情況下,增加了網(wǎng)絡(luò)的深度和寬度,提高了特征提取的效率和準(zhǔn)確性。
????????在訓(xùn)練過(guò)程中,VGG16一般采用基于隨機(jī)梯度下降(Stochastic Gradient Descent,SGD)的反向傳播算法,通過(guò)最小化交叉熵?fù)p失函數(shù)來(lái)優(yōu)化模型參數(shù)。在訓(xùn)練過(guò)程中,可以使用數(shù)據(jù)增強(qiáng)、正則化、dropout等技術(shù)來(lái)提高模型的泛化能力和魯棒性。
????????總的來(lái)說(shuō),VGG16是一個(gè)非常經(jīng)典和有效的卷積神經(jīng)網(wǎng)絡(luò)模型,具有良好的特征提取和分類能力,可以應(yīng)用于圖像分類、目標(biāo)檢測(cè)等計(jì)算機(jī)視覺任務(wù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-454224.html
VGG16源碼(tensorflow版)
import tensorflow as tf
from tensorflow.keras import optimizers,losses,models,datasets,Sequential
from tensorflow.keras.layers import Dense,Conv2D,BatchNormalization,MaxPooling2D,Flatten
class vgg16(models.Model):
def __init__(self):
super(vgg16, self).__init__()
self.model = models.Sequential([
Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu'),
Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu'),
BatchNormalization(),
MaxPooling2D(),
Conv2D(filters=128,kernel_size = (3,3),padding='same',activation='relu'),
Conv2D(filters=128,kernel_size = (3,3),padding='same',activation='relu'),
BatchNormalization(),
MaxPooling2D(),
Conv2D(filters=256, kernel_size=(3, 3),padding='same', activation='relu'),
Conv2D(filters=256, kernel_size=(3, 3),padding='same', activation='relu'),
Conv2D(filters=256, kernel_size=(3, 3),padding='same', activation='relu'),
BatchNormalization(),
MaxPooling2D(),
Conv2D(filters=512, kernel_size=(3, 3),padding='same', activation='relu'),
Conv2D(filters=512, kernel_size=(3, 3), padding='same',activation='relu'),
Conv2D(filters=512, kernel_size=(3, 3), padding='same',activation='relu'),
BatchNormalization(),
MaxPooling2D(),
Conv2D(filters=512, kernel_size=(3, 3), padding='same',activation='relu'),
Conv2D(filters=512, kernel_size=(3, 3),padding='same', activation='relu'),
Conv2D(filters=512, kernel_size=(3, 3), padding='same',activation='relu'),
BatchNormalization(),
MaxPooling2D(),
Flatten(),
Dense(512,activation='relu'),
Dense(256,activation='relu'),
Dense(10,activation='softmax')
])
def call(self, x, training=None, mask=None):
x = self.model(x)
return x
def main():
(train_x,train_y),(test_x,test_y) = datasets.cifar10.load_data()
train_x = train_x.reshape(-1,32,32,3) / 255.0
test_x = test_x.reshape(-1,32,32,3) / 255.0
model = vgg16()
# model.build((None,32,32,3))
# model.summary() 不使用類寫VGG的話,就不報(bào)錯(cuò),使用了類寫VGG就報(bào)錯(cuò),我也很無(wú)奈
model.compile(optimizer=optimizers.Adam(0.01),
loss = losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
model.fit(train_x,train_y,epochs=10,batch_size=128)
score = model.evaluate(test_x,test_y,batch_size=50)
print('loss:',score[0])
print('acc:',score[1])
pass
if __name__ == '__main__':
main()
訓(xùn)練10個(gè)epoch的效果
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-454224.html
到了這里,關(guān)于VGG16詳細(xì)原理(含tensorflow版源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!