日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ResNet50 复现

發(fā)布時間:2025/3/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ResNet50 复现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ResNet50 復現(xiàn):

環(huán)境:

windows10

tensorflow2.1

Python 3.7

cuda 10.2

?

?

模型定義文件:model.py

# -*- coding:utf-8 _*- """ # @Author: DongHao # @Date: 2020/10/30 16:25 # @File: model.py """ from tensorflow.keras import Model, layers, Sequentialclass BasicBlock(layers.Layer):expansion = 1 # 殘差結(jié)構(gòu)中卷積核的變化系數(shù)def __init__(self, out_channel, strides=1, downsample=None, **kwargs):super(BasicBlock, self).__init__(**kwargs)# --------------------------------------------------------------------------self.conv1 = layers.Conv2D(out_channel, kernel_size=3, strides=strides,padding='SAME', use_bias=False)self.bn1 = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)# --------------------------------------------------------------------------self.conv2 = layers.Conv2D(out_channel, kernel_size=3, strides=1,padding='SAME', use_bias=False)self.bn2 = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)# --------------------------------------------------------------------------self.downsample = downsampleself.relu = layers.ReLU()self.add = layers.Add() # 加法運算def call(self, inputs, training=False):identity = inputs # 捷徑分支上所對應的輸出的值if self.downsample is not None:identity = self.downsample(inputs)x = self.conv1(inputs)x = self.bn1(x, training=training)x = self.relu(x)x = self.conv2(x)x = self.bn2(x, training=training)x = self.add([identity, x])x = self.relu(x)return x# 50、101、152 class Bottleneck(layers.Layer):expansion = 4def __init__(self, out_channel, strides=1, downsample=None, **kwargs):super(Bottleneck, self).__init__(**kwargs)# --------------------------------------------------------------------------self.conv1 = layers.Conv2D(out_channel, kernel_size=1, use_bias=False, name="conv1")self.bn1 = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="conv1/BatchNorm")# --------------------------------------------------------------------------self.conv2 = layers.Conv2D(out_channel, kernel_size=3, strides=strides,padding='SAME', use_bias=False, name="conv2")self.bn2 = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="conv2/BatchNorm")# --------------------------------------------------------------------------self.conv3 = layers.Conv2D(out_channel*self.expansion, kernel_size=1, use_bias=False, name="conv3")self.bn3 = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name="conv3/BatchNorm")# --------------------------------------------------------------------------self.downsample = downsampleself.relu = layers.ReLU()self.add = layers.Add() # 加法運算def call(self, inputs, training=False):identity = inputs # 捷徑分支上所對應的輸出的值if self.downsample is not None:identity = self.downsample(inputs)x = self.conv1(inputs)x = self.bn1(x, training=training)x = self.relu(x)x = self.conv2(x)x = self.bn2(x, training=training)x = self.relu(x)x = self.conv3(x)x = self.bn3(x, training=training)x = self.add([identity, x])x = self.relu(x)return xclass ResNet(Model):def __init__(self, block, blocks_num, num_classes=1000, include_top=True, **kwargs):super(ResNet, self).__init__(**kwargs)self.include_top = include_topself.conv1 = layers.Conv2D(filters=64, kernel_size=7, strides=2, padding="SAME",use_bias=False, name="conv1")self.bn1 = layers.BatchNormalization(momentum=0.9, epsilon=1.001e-5, name="conv1/BatchNorm")self.relu1 = layers.ReLU(name="relu1")self.maxpool1 = layers.MaxPool2D(pool_size=3, strides=2, padding="SAME", name="maxpool1")self.block1 = self._make_layer(block, True, 64, blocks_num[0], name="block1")self.block2 = self._make_layer(block, False, 128, blocks_num[1], strides=2, name="block2")self.block3 = self._make_layer(block, False, 256, blocks_num[2], strides=2, name="block3")self.block4 = self._make_layer(block, False, 512, blocks_num[3], strides=2, name="block4")if self.include_top:self.avgpool = layers.GlobalAvgPool2D(name="avgpool1")self.fc = layers.Dense(num_classes, name="logits")self.softmax = layers.Softmax()def call(self, inputs, training=False, **kwargs):x = self.conv1(inputs)x = self.bn1(x, training=training)x = self.relu1(x)x = self.maxpool1(x)x = self.block1(x, training=training)x = self.block2(x, training=training)x = self.block3(x, training=training)x = self.block4(x, training=training)if self.include_top:x = self.avgpool(x)x = self.fc(x)x = self.softmax(x)return xdef _make_layer(self, block, first_block, channel, block_num, strides=1, name=None):downsample = Noneif strides != 1 or first_block is True:downsample = Sequential([layers.Conv2D(channel * block.expansion, kernel_size=1, strides=strides,use_bias=False, name="conv1"),layers.BatchNormalization(momentum=0.9, epsilon=1.001e-5, name="BatchNorm")], name="shortcut")layers_list = [(block(channel, downsample=downsample, strides=strides, name="unit_1"))]for index in range(1, block_num):layers_list.append(block(channel, name="unit_" + str(index + 1)))return Sequential(layers_list, name=name)def resnet34(num_classes=1000, include_top=True):block_num = [3, 4, 6, 3]return ResNet(BasicBlock, block_num, num_classes, include_top)def resnet50(num_classes=1000, include_top=True):block_num = [3, 4, 6, 3]return ResNet(Bottleneck, block_num, num_classes, include_top)def resnet101(num_classes=1000, include_top=True):blocks_num = [3, 4, 23, 3]return ResNet(Bottleneck, blocks_num, num_classes, include_top)

?

訓練文件 train.py

# -*- coding:utf-8 _*- """ # @Author: DongHao # @Date: 2020/11/3 15:29 # @File: train.py """ from tensorflow.keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt from model import resnet50 import tensorflow as tf from PIL import Image import numpy as np import json import osos.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "0"im_height = 224 im_width = 224 classical_path = "./class_indices.json" checkpoint_save_path = "./checkpoint/ResNet.ckpt" test_data_path = os.path.abspath(os.getcwd() + "/../DataSet/testdata") train_dir = os.path.abspath(os.getcwd() + "/../DataSet/flower_data/train") validation_dir = os.path.abspath(os.getcwd() + "/../DataSet/flower_data/val")print("\n=============================這里是 ResNet ===========================\n")train_image_generator = ImageDataGenerator(horizontal_flip=True) train_data_gen = train_image_generator.flow_from_directory(directory=train_dir, batch_size=3306, shuffle=True,target_size=(im_height, im_width), class_mode='categorical')class_indices = train_data_gen.class_indices # get class dict inverse_dict = dict((val, key) for key, val in class_indices.items()) json_str = json.dumps(inverse_dict, indent=4) with open(classical_path, 'w') as json_file:json_file.write(json_str)validation_image_generator = ImageDataGenerator() val_data_gen = validation_image_generator.flow_from_directory(directory=validation_dir, batch_size=364, shuffle=False,target_size=(im_height, im_width), class_mode='categorical')print("class_indices : ", class_indices) print("total_train : ", train_data_gen.n) print("total_val : ", val_data_gen.n)print("===============================數(shù)據(jù)加載中===========================") train_x, train_y = next(train_data_gen) validation_x, validation_y = next(val_data_gen) print("=============================數(shù)據(jù)加載完畢===========================\n")print("=============================模型加載中===========================") model = resnet50(num_classes=5, include_top=True) model.build((None, 224, 224, 3)) model.summary() # model.build(input_shape) # `input_shape` is the shape of the input data, e.g. input_shape = (None, 32, 32, 3) model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.0001),loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),metrics=["accuracy"]) print("=============================模型加載完畢===========================\n")print("=============================模型訓練中===========================") cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path, save_weights_only=True, save_best_only=True) model.fit(train_x, train_y, batch_size=32, epochs=1000, validation_data=(validation_x, validation_y), callbacks=[cp_callback]) model.summary() print("=============================模型訓練完畢===========================\n")

?

?

預測文件 predict.py

# -*- coding:utf-8 _*- """ # @Author: DongHao # @Date: 2020/11/3 22:30 # @File: predict.py """ from tensorflow.keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt from ResNet.model import resnet50 import tensorflow as tf from PIL import Image import numpy as np import json import osos.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "-1"im_height = 224 im_width = 224 modelname = "ResNet" classical_path = "./" + modelname + "/class_indices.json" checkpoint_save_path = "./" + modelname + "/checkpoint/" + modelname + ".ckpt" test_data_path = os.path.abspath(os.getcwd() + "/DataSet/testdata")print("=============================這里是 " + modelname + " ===========================\n") with open(classical_path, 'r') as json_file:class_indict = json.load(json_file)print("=============================模型加載中===========================") model = resnet50(num_classes=5, include_top=True) model.load_weights(checkpoint_save_path) print("checkpoint path is ", checkpoint_save_path) print("=============================模型加載完畢===========================\n")print("=============================模型預測中===========================") files = os.listdir(test_data_path) for name in files:path = test_data_path + "\\" + str(name)img = Image.open(path)img = img.resize((im_width, im_height))img = np.array(img).astype(np.float32)img = (np.expand_dims(img, 0))result = model.predict(img)prediction = np.squeeze(result)predict_class = np.argmax(result)print(name)print(class_indict[str(predict_class)], prediction[predict_class])print("result is :", result) print("=============================模型預測完畢===========================\n")

?

?

聲明:

1、 model.py文件的編寫,參考B站up主的教程:https://www.bilibili.com/video/BV1WE41177Ya, “劈里吧啦”up主講的很好,學習的同學請移步B站,?侵權(quán)刪除

2、 以上代碼中涉及到的路徑,請匹配你自己的文件路徑

3、代碼編寫有多種形式,個人喜好問題,請酌情參考

4、難免有錯誤之處,請大家指出,共同交流進步

總結(jié)

以上是生活随笔為你收集整理的ResNet50 复现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。