ResNet18和ResNet50的keras实现

article/2025/11/10 15:17:31

注意低版本的keras对一些包的引用方式跟高版本有区别,注意看章节1的代码注释部分。

TensorFlow跟Keras也有版本的对应关系,https://master–floydhub-docs.netlify.app/guides/environments/。
例如:
在这里插入图片描述

1.ResNet18

ResNet18

from tensorflow import keras
from tensorflow.keras import layers
# 对于keras==2.0.8应该写成下面这句(pip install keras==2.0.8 -i https://pypi.tuna.tsinghua.edu.cn/simple):
# from tensorflow.python.keras import layersINPUT_SIZE = 224
CLASS_NUM = 1000# stage_name=2,3,4,5;  block_name=a,b,c
def ConvBlock(input_tensor, num_output, stride, stage_name, block_name):filter1, filter2 = num_outputx = layers.Conv2D(filter1, 3, strides=stride, padding='same', name='res'+stage_name+block_name+'_branch2a')(input_tensor)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2a')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2a_relu')(x)x = layers.Conv2D(filter2, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2b')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2b')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2b_relu')(x)shortcut = layers.Conv2D(filter2, 1, strides=stride, padding='same', name='res'+stage_name+block_name+'_branch1')(input_tensor)shortcut = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch1')(shortcut)x = layers.add([x, shortcut], name='res'+stage_name+block_name)x = layers.Activation('relu', name='res'+stage_name+block_name+'_relu')(x)return xdef IdentityBlock(input_tensor, num_output, stage_name, block_name):filter1, filter2 = num_outputx = layers.Conv2D(filter1, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2a')(input_tensor)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2a')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2a_relu')(x)x = layers.Conv2D(filter2, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2b')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2b')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2b_relu')(x)shortcut = input_tensorx = layers.add([x, shortcut], name='res'+stage_name+block_name)x = layers.Activation('relu', name='res'+stage_name+block_name+'_relu')(x)return xdef ResNet18(input_shape, class_num):input = keras.Input(shape=input_shape, name='input')# conv1x = layers.Conv2D(64, 7, strides=(2, 2), padding='same', name='conv1')(input)  # 7×7, 64, stride 2x = layers.BatchNormalization(name='bn_conv1')(x)x = layers.Activation('relu', name='conv1_relu')(x)x = layers.MaxPooling2D((3, 3), strides=2, padding='same', name='pool1')(x)   # 3×3 max pool, stride 2# conv2_xx = ConvBlock(input_tensor=x, num_output=(64, 64), stride=(1, 1), stage_name='2', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(64, 64), stage_name='2', block_name='b')# conv3_xx = ConvBlock(input_tensor=x, num_output=(128, 128), stride=(2, 2), stage_name='3', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(128, 128), stage_name='3', block_name='b')# conv4_xx = ConvBlock(input_tensor=x, num_output=(256, 256), stride=(2, 2), stage_name='4', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(256, 256), stage_name='4', block_name='b')# conv5_xx = ConvBlock(input_tensor=x, num_output=(512, 512), stride=(2, 2), stage_name='5', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(512, 512), stage_name='5', block_name='b')# average pool, 1000-d fc, softmaxx = layers.AveragePooling2D((7, 7), strides=(1, 1), name='pool5')(x)x = layers.Flatten(name='flatten')(x)x = layers.Dense(class_num, activation='softmax', name='fc1000')(x)model = keras.Model(input, x, name='resnet18')# 对于keras==2.0.8应该写成下面这句,否则会报错:AttributeError: module 'tensorflow.python.keras' has no attribute 'Model'# model = keras.models.Model(input, x, name='resnet18')model.summary()return modelif __name__ == '__main__':model = ResNet18((INPUT_SIZE, INPUT_SIZE, 3), CLASS_NUM)print('Done.')

train_resnet18.py

from tensorflow import keras
from tensorflow.keras import layers
# 对于keras==2.0.8应该写成:from tensorflow.python.keras import layers
# pip install keras==2.0.8  -i https://pypi.tuna.tsinghua.edu.cn/simple INPUT_SIZE = 224
CLASS_NUM = 2# stage_name=2,3,4,5;  block_name=a,b,c
def ConvBlock(input_tensor, num_output, stride, stage_name, block_name):filter1, filter2 = num_outputx = layers.Conv2D(filter1, 3, strides=stride, padding='same', name='res'+stage_name+block_name+'_branch2a')(input_tensor)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2a')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2a_relu')(x)x = layers.Conv2D(filter2, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2b')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2b')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2b_relu')(x)shortcut = layers.Conv2D(filter2, 1, strides=stride, padding='same', name='res'+stage_name+block_name+'_branch1')(input_tensor)shortcut = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch1')(shortcut)x = layers.add([x, shortcut], name='res'+stage_name+block_name)x = layers.Activation('relu', name='res'+stage_name+block_name+'_relu')(x)return xdef IdentityBlock(input_tensor, num_output, stage_name, block_name):filter1, filter2 = num_outputx = layers.Conv2D(filter1, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2a')(input_tensor)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2a')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2a_relu')(x)x = layers.Conv2D(filter2, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2b')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2b')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2b_relu')(x)shortcut = input_tensorx = layers.add([x, shortcut], name='res'+stage_name+block_name)x = layers.Activation('relu', name='res'+stage_name+block_name+'_relu')(x)return xdef ResNet18(input_shape, class_num):input = keras.Input(shape=input_shape, name='input')# conv1x = layers.Conv2D(64, 7, strides=(2, 2), padding='same', name='conv1')(input)  # 7×7, 64, stride 2x = layers.BatchNormalization(name='bn_conv1')(x)x = layers.Activation('relu', name='conv1_relu')(x)x = layers.MaxPooling2D((3, 3), strides=2, padding='same', name='pool1')(x)   # 3×3 max pool, stride 2# conv2_xx = ConvBlock(input_tensor=x, num_output=(64, 64), stride=(1, 1), stage_name='2', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(64, 64), stage_name='2', block_name='b')# conv3_xx = ConvBlock(input_tensor=x, num_output=(128, 128), stride=(2, 2), stage_name='3', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(128, 128), stage_name='3', block_name='b')# conv4_xx = ConvBlock(input_tensor=x, num_output=(256, 256), stride=(2, 2), stage_name='4', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(256, 256), stage_name='4', block_name='b')# conv5_xx = ConvBlock(input_tensor=x, num_output=(512, 512), stride=(2, 2), stage_name='5', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(512, 512), stage_name='5', block_name='b')# average pool, 1000-d fc, softmaxx = layers.AveragePooling2D((7, 7), strides=(1, 1), name='pool5')(x)x = layers.Flatten(name='flatten')(x)x = layers.Dense(class_num, activation='softmax', name='fc1000')(x)model = keras.Model(input, x, name='resnet18')model.summary()return modelif __name__ == '__main__':model = ResNet18((INPUT_SIZE, INPUT_SIZE, 3), CLASS_NUM)print('Done.')

predict_resnet18.py

import matplotlib.pyplot as pltfrom ResNet18 import ResNet18
import cv2
import numpy as np
from tensorflow.keras import backend as K   # K.set_image_dim_ordering('tf')
from tensorflow.keras.utils import to_categoricalINPUT_IMG_SIZE = 224
NUM_CLASSES = 2
label_dict = {0:'CAT', 1:'DOG'}def show_predict_probability(y_gts, predictions, x_imgs, predict_probabilitys, idx):for i in range(len(label_dict)):print(label_dict[i]+', Probability:%1.9f'%(predict_probabilitys[idx][i]))print('label: ', label_dict[int(y_gts[idx])], ', predict: ', label_dict[predictions[idx]])plt.figure(figsize=(2, 2))plt.imshow(np.reshape(x_imgs[idx], (INPUT_IMG_SIZE, INPUT_IMG_SIZE, 3)))plt.show()def plot_images_labels_prediction(images, labels, prediction, idx, num):fig = plt.gcf()fig.set_size_inches(12, 14)if num>25: num=25for i in range(0, num):ax = plt.subplot(2, 5, 1+i)ax.imshow(images[idx], cmap='binary')title = 'labels='+str(labels[idx])if len(prediction) > 0:title += "prediction="+str(prediction[idx])ax.set_title(title, fontsize=10)idx += 1plt.show()if __name__ == '__main__':log_path = r"D:\02.Work\00.LearnML\003.Net\ResNet\log\\"model = ResNet18((224, 224, 3), NUM_CLASSES)model.load_weights(log_path+"resnet18.h5")### cat dog datasetlines = []root_path = r"D:\03.Data\01.CatDog"with open(root_path + "\\test.txt") as f:lines = f.readlines()x_images_normalize = []y_labels_onehot = []y_labels = []for i in range(len(lines)):img_path = lines[i].split(";")[0]img = cv2.imread(img_path)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = cv2.resize(img, (INPUT_IMG_SIZE, INPUT_IMG_SIZE))img = img / 255x_images_normalize.append(img)label = to_categorical(lines[i].split(";")[1], num_classes=NUM_CLASSES)y_labels_onehot.append(label)y_labels.append(lines[i].split(";")[1])x_images_normalize = np.array(x_images_normalize)# x_images_normalize = x_images_normalize.reshape(-1, INPUT_IMG_SIZE, INPUT_IMG_SIZE, 3)y_labels_onehot = np.array(y_labels_onehot)predict_probability = model.predict(x_images_normalize, verbose=1)predict = np.argmax(predict_probability, axis=1)plot_images_labels_prediction(x_images_normalize, y_labels, predict, 0, 10)show_predict_probability(y_labels, predict, x_images_normalize, predict_probability, 0)print('done')

2.ResNet50

ResNet50

from tensorflow import keras
from tensorflow.keras import layersINPUT_SIZE = 224
CLASS_NUM = 1000# stage_name=2,3,4,5;  block_name=a,b,c
def ConvBlock(input_tensor, num_output, stride, stage_name, block_name):filter1, filter2, filter3 = num_outputx = layers.Conv2D(filter1, 1, strides=stride, padding='same', name='res'+stage_name+block_name+'_branch2a')(input_tensor)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2a')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2a_relu')(x)x = layers.Conv2D(filter2, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2b')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2b')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2b_relu')(x)x = layers.Conv2D(filter3, 1, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2c')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2c')(x)shortcut = layers.Conv2D(filter3, 1, strides=stride, padding='same', name='res'+stage_name+block_name+'_branch1')(input_tensor)shortcut = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch1')(shortcut)x = layers.add([x, shortcut], name='res'+stage_name+block_name)x = layers.Activation('relu', name='res'+stage_name+block_name+'_relu')(x)return xdef IdentityBlock(input_tensor, num_output, stage_name, block_name):filter1, filter2, filter3 = num_outputx = layers.Conv2D(filter1, 1, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2a')(input_tensor)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2a')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2a_relu')(x)x = layers.Conv2D(filter2, 3, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2b')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2b')(x)x = layers.Activation('relu', name='res'+stage_name+block_name+'_branch2b_relu')(x)x = layers.Conv2D(filter3, 1, strides=(1, 1), padding='same', name='res'+stage_name+block_name+'_branch2c')(x)x = layers.BatchNormalization(name='bn'+stage_name+block_name+'_branch2c')(x)shortcut = input_tensorx = layers.add([x, shortcut], name='res'+stage_name+block_name)x = layers.Activation('relu', name='res'+stage_name+block_name+'_relu')(x)return xdef ResNet50(input_shape, class_num):input = keras.Input(shape=input_shape, name='input')# conv1x = layers.Conv2D(64, 7, strides=(2, 2), padding='same', name='conv1')(input)  # 7×7, 64, stride 2x = layers.BatchNormalization(name='bn_conv1')(x)x = layers.Activation('relu', name='conv1_relu')(x)x = layers.MaxPooling2D((3, 3), strides=2, padding='same', name='pool1')(x)   # 3×3 max pool, stride 2# conv2_xx = ConvBlock(input_tensor=x, num_output=(64, 64, 256), stride=(1, 1), stage_name='2', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(64, 64, 256), stage_name='2', block_name='b')x = IdentityBlock(input_tensor=x, num_output=(64, 64, 256), stage_name='2', block_name='c')# conv3_xx = ConvBlock(input_tensor=x, num_output=(128, 128, 512), stride=(2, 2), stage_name='3', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(128, 128, 512), stage_name='3', block_name='b')x = IdentityBlock(input_tensor=x, num_output=(128, 128, 512), stage_name='3', block_name='c')x = IdentityBlock(input_tensor=x, num_output=(128, 128, 512), stage_name='3', block_name='d')# conv4_xx = ConvBlock(input_tensor=x, num_output=(256, 256, 1024), stride=(2, 2), stage_name='4', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(256, 256, 1024), stage_name='4', block_name='b')x = IdentityBlock(input_tensor=x, num_output=(256, 256, 1024), stage_name='4', block_name='c')x = IdentityBlock(input_tensor=x, num_output=(256, 256, 1024), stage_name='4', block_name='d')x = IdentityBlock(input_tensor=x, num_output=(256, 256, 1024), stage_name='4', block_name='e')x = IdentityBlock(input_tensor=x, num_output=(256, 256, 1024), stage_name='4', block_name='f')# conv5_xx = ConvBlock(input_tensor=x, num_output=(512, 512, 2048), stride=(2, 2), stage_name='5', block_name='a')x = IdentityBlock(input_tensor=x, num_output=(512, 512, 2048), stage_name='5', block_name='b')x = IdentityBlock(input_tensor=x, num_output=(512, 512, 2048), stage_name='5', block_name='c')# average pool, 1000-d fc, softmaxx = layers.AveragePooling2D((7, 7), strides=(1, 1), name='pool5')(x)x = layers.Flatten(name='flatten')(x)x = layers.Dense(class_num, activation='softmax', name='fc1000')(x)model = keras.Model(input, x, name='resnet50')model.summary()return modelif __name__ == '__main__':model = ResNet50((INPUT_SIZE, INPUT_SIZE, 3), CLASS_NUM)print('Done.')

http://chatgpt.dhexx.cn/article/EAtcSTho.shtml

相关文章

【学习笔记】resnet-18 pytorch源代码解读

目录 ResNet-18网络结构简图ResNet-18的代码结构残差块结构ResNet类构造方法和forward_make_layer方法 完整的ResNet-18结构图 使用的resnet-18的源代码来源于 PyTorch1.0, torchvision0.2.2 ResNet-18网络结构简图 ResNet(Residual Neural Network&a…

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

ResNet18原理 ResNet18是一个经典的深度卷积神经网络模型,由微软亚洲研究院提出,用于参加2015年的ImageNet图像分类比赛。ResNet18的名称来源于网络中包含的18个卷积层。 ResNet18的基本结构如下: 输入层:接收大小为224x224的RG…

resnet18

前言 在前篇vgg16之后,无法成功训练vgg16,发现是自己电脑可用的显存太低了,遂放弃。 在2015 ILSVRC&COCO比赛中,何恺明团队提出的Resnet网络斩获第一,这是一个经典的网络。李沐说过,如果要学习一个CNN网…

ResNet18网络的具体构成

一、基础 RetNet网络的基础是残差块。 以下是原始论文所给出的最基础的残差块。后续可以对单残差块进行处理,如加入池化,批量化归一等各种操作。 二、最基本的的ResNet18 ResNet18的基本含义是,网络的基本架构是ResNet,网络的深…

【神经网络】(10) Resnet18、34 残差网络复现,附python完整代码

各位同学好,今天和大家分享一下 TensorFlow 深度学习中如何搭载 Resnet18 和 Resnet34 残差神经网络,残差网络利用 shotcut 的方法成功解决了网络退化的问题,在训练集和校验集上,都证明了的更深的网络错误率越小。 论文中给出的具…

Resnet 18网络模型

1. 残差网络:(Resnet) 残差块: 让我们聚焦于神经网络局部:如图左侧所示,假设我们的原始输入为x,而希望学出的理想映射为f(x)(作为上方激活函数的输入)。左图虚线框中…

【ResNet】Pytorch从零构建ResNet18

Pytorch从零构建ResNet 第一章 从零构建ResNet18 第二章 从零构建ResNet50 文章目录 Pytorch从零构建ResNet前言一、ResNet是什么?1. 残差学习2. ResNet具体结构 二、ResNet分步骤实现三、完整例子测试总结 前言 ResNet 目前是应用很广的网络基础框架,所…

HTML+CSS 简单的顶部导航栏菜单制作

导航栏的制作: 技术要求: CSSHTML各类标签 实现目的: 制作导航栏菜单 代码分析: 基本样式清除无序列原点删除下划线删除文字默认居中a标签设置块级元素伪类选择器对a状态修饰 分步实现: 分三栏布局:…

WEB前端(7)—— 简单的 HTML+CSS 导航栏案例

适合每个新手的导航栏&#xff1a; 代码与运行效果如图&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>导航栏</title><style type"text/css">ul{/*设置导航栏的框框*/margin: 30px…

CSS — 导航栏篇(一)

Navigation Bar Navigation Bar 是什么&#xff1f;这就是每个网站都会有的导航栏&#xff0c;本文将会带你接触导航栏的世界。首先我们需要了解导航栏的作用——它能快速帮助用户进行需求选择。一个清晰的导航栏能让用户第一时间了解网站的基本模块功能&#xff0c;而且作为网…

CSS + HTML导航栏效果

今天写了一个导航栏&#xff0c;需要的效果如下&#xff1a; 实现的代码思路如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>导航栏</title><style type"text/css&qu…

html+css创建侧边导航栏

效果&#xff1a; 代码&#xff1a; .left{position: fixed;width: 250px;height: 2000px;background-color: rgb(100, 93, 93);float: left;text-align: center; } .nav a{display: block;width: 247px;height: 70px;background-color: rgb(100, 93, 93);color: rgb(254, 254…

HTML5+CSS3制作底部导航栏

目录 前言 一、底部导航栏示例图 二、HTML框架 1.一号盒子 2.二号盒子 总结 ​​​​​​ 前言 在日常的网上冲浪中&#xff0c;我们常常在网页最底部&#xff0c;看到一大堆链接&#xff0c;非常整齐&#xff0c;一目了然&#xff0c;那么是如何实现的呢&#xff1f;..…

网页制作之侧边导航栏(只用HTML实现)

话不多说&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" con…

CSS【导航栏】

导航栏链接列表 作为标准的HTML基础一个导航栏是必须的。在我们的例子中我们将建立一个标准的HTML列表导航栏。导航条基本上是一个链接列表&#xff0c;所以使用 <ul> 和 <li>元素非常有意义&#xff1a; <!DOCTYPE html><html><head><meta…

html中网页导航栏设置

以下内容是摘抄博客&#xff1a;https://www.runoob.com/css/css-navbar.html 设计导航窗口在左侧的显示如下&#xff1a; 代码部分则如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoo…

html左侧导航栏右侧显示内容

效果图 代码 复制下来直接运行就可以 <!doctype html> <html lang "en"><head><meta charset "UTF-8"><meta name "viewport"content "widthdevice-width, user-scalableno, initial-scale1.0, maximum-s…

导航栏的HTML的布局方式

1.利用浮动完成布局 以小米导航栏为例 <style>* {padding: 0;margin: 0;/* 通配符全选&#xff0c;取消内外边距的小缝隙 // 不建议使用通配符 */}header {width: 100%;background-color: #333333;/* 设置背景 */}div {width: 1226px;height: 40px;margin: auto;/* 设…

html里制作简单导航栏

今天简单的做了一下网页里的导航栏。 效果如下&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>实验3</title><style type"text/css">ul{/*设置导航栏的框框*/margi…

html中关于侧边导航栏和导航栏的编写

侧边导航栏 <style>.box{width: 50px;height: 50px;background-color: #483957;transition: width .5s,background-color .2s;}.box:hover{background-color: #004FCB;width: 200px;cursor: pointer;}.a1{position: fixed;right: 40px;top: 200px;float: right;}</st…