ResNet18原理
? ? ? ? ResNet18是一個(gè)經(jīng)典的深度卷積神經(jīng)網(wǎng)絡(luò)模型,由微軟亞洲研究院提出,用于參加2015年的ImageNet圖像分類比賽。ResNet18的名稱來(lái)源于網(wǎng)絡(luò)中包含的18個(gè)卷積層。
ResNet18的基本結(jié)構(gòu)如下:
- 輸入層:接收大小為224x224的RGB圖像。
- 卷積層:共4個(gè)卷積層,每個(gè)卷積層使用3x3的卷積核和ReLU激活函數(shù),提取圖像的局部特征。
- 殘差塊:共8個(gè)殘差塊,每個(gè)殘差塊由兩個(gè)卷積層和一條跳躍連接構(gòu)成,用于解決深度卷積神經(jīng)網(wǎng)絡(luò)中梯度消失和梯度爆炸問(wèn)題。
- 全局平均池化層:對(duì)特征圖進(jìn)行全局平均池化,將特征圖轉(zhuǎn)化為一維
向量。
- 全連接層:包含一個(gè)大小為1000的全連接層,用于分類輸出。
- 輸出層:使用softmax激活函數(shù),生成1000個(gè)類別的概率分布。
?
???? ? ? ? ResNet18的主要特點(diǎn)是引入了殘差塊(Residual Block)的概念,用于解決深度卷積神經(jīng)網(wǎng)絡(luò)中梯度消失和梯度爆炸問(wèn)題。在殘差塊中,跳躍連接(Shortcut Connection)可以將輸入直接連接到輸出,使得網(wǎng)絡(luò)可以學(xué)習(xí)到殘差信息,從而更好地進(jìn)行特征提取和處理。
? ? ? ? 在訓(xùn)練過(guò)程中,ResNet18一般采用基于隨機(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ō),ResNet18是一個(gè)非常經(jīng)典和有效的深度卷積神經(jīng)網(wǎng)絡(luò)模型,具有良好的特征提取和分類能力,可以應(yīng)用于圖像分類、目標(biāo)檢測(cè)等計(jì)算機(jī)視覺(jué)任務(wù)。
ResNet18源碼(tensorflow版)
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers,datasets,models
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
inputs = keras.Input((32,32,3))
output = ResNet18(inputs)
model = models.Model(inputs,output)
model.summary()
model.compile(loss = keras.losses.SparseCategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(0.01),
metrics=['accuracy'])
model.fit(train_x,train_y,batch_size=128,epochs=10)
score = model.evaluate(test_x,test_y)
print("loss:",score[0])
print("acc:",score[1])
pass
def ConvCall(x,filtten,xx,yy,strides = (1,1)):
x = layers.Conv2D(filtten,(xx,yy),strides=strides,padding='same')(x)
x = layers.BatchNormalization()(x)
return x
def ResNetblock(input,filtten,strides = (1,1)):
x = ConvCall(input,filtten,3,3,strides=strides)
x = layers.Activation("relu")(x)
x = ConvCall(x,filtten,3,3,strides=(1,1))
if strides != (1,1):
residual = ConvCall(input,filtten,1,1,strides=strides)
else:
residual = input
x = x + residual
x = layers.Activation("relu")(x)
return x
def ResNet18(inputs):
x = ConvCall(inputs, 64, 3, 3, strides=(1, 1))
x = layers.Activation('relu')(x)
x = ResNetblock(x, 64, strides=(1, 1))
x = ResNetblock(x, 64, strides=(1, 1))
x = ResNetblock(x, 128, strides=(2, 2))
x = ResNetblock(x, 128, strides=(1, 1))
x = ResNetblock(x, 256, strides=(2, 2))
x = ResNetblock(x, 256, strides=(1, 1))
x = ResNetblock(x, 512, strides=(2, 2))
x = ResNetblock(x, 512, strides=(1, 1))
x = layers.GlobalAveragePooling2D()(x) # 全局平均池化
output = layers.Dense(10, "softmax")(x)
return output
if __name__ == '__main__':
main()
訓(xùn)練10個(gè)epoch的效果
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441983.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-441983.html
?
到了這里,關(guān)于ResNet18詳細(xì)原理(含tensorflow版源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!