当前位置: 代码网 > it编程>游戏开发>ar > ResNet18详细原理(含tensorflow版源码)

ResNet18详细原理(含tensorflow版源码)

2024年08月04日 ar 我要评论
ResNet18详细原理(含tensorflow版源码)

resnet18原理

        resnet18是一个经典的深度卷积神经网络模型,由微软亚洲研究院提出,用于参加2015年的imagenet图像分类比赛。resnet18的名称来源于网络中包含的18个卷积层。

resnet18的基本结构如下:

  • 输入层:接收大小为224x224的rgb图像。
  • 卷积层:共4个卷积层,每个卷积层使用3x3的卷积核和relu激活函数,提取图像的局部特征。
  • 残差块:共8个残差块,每个残差块由两个卷积层和一条跳跃连接构成,用于解决深度卷积神经网络中梯度消失和梯度爆炸问题。
  • 全局平均池化层:对特征图进行全局平均池化,将特征图转化为一维

    向量。

  • 全连接层:包含一个大小为1000的全连接层,用于分类输出。
  • 输出层:使用softmax激活函数,生成1000个类别的概率分布。

 

           resnet18的主要特点是引入了残差块(residual block)的概念,用于解决深度卷积神经网络中梯度消失和梯度爆炸问题。在残差块中,跳跃连接(shortcut connection)可以将输入直接连接到输出,使得网络可以学习到残差信息,从而更好地进行特征提取和处理。

        在训练过程中,resnet18一般采用基于随机梯度下降(stochastic gradient descent,sgd)的反向传播算法,通过最小化交叉熵损失函数来优化模型参数。在训练过程中,可以使用数据增强、正则化、dropout等技术来提高模型的泛化能力和鲁棒性。

        总的来说,resnet18是一个非常经典和有效的深度卷积神经网络模型,具有良好的特征提取和分类能力,可以应用于图像分类、目标检测等计算机视觉任务。

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()

训练10个epoch的效果

 

 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com