TensorFlow2.0 搭建简单的ResNet和训练

2023-05-16

1.resnet.py

import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics

class BasicBlock(layers.Layer):
    def __init__(self, filter_num, stride=1):
        super(BasicBlock,self).__init__()
        
        self.conv1 = layers.Conv2D(filter_num, (3,3), strides=stride, padding='same')
        self.bn1 = layers.BatchNormalization()
        self.relu = layers.Acativation('relu')
        
        self.conv2 = layers.Conv2D(filter_num, (3,3), strides=1, padding='same')
        self.bn2 = layers.BatchNormalization()
         
        if stride != 1: #维数不为1的时候需要进行下采样
            self.downsample = Sequential()
            self.downsample.add(layers.Conv2D(filter_num, (1,1), strides=stride))
            self.downsample.add(layers.BatchNormalization())
        
        else:
            self.downsample = lambda x: x
        
       # self.stride = stride
    
    def call(self, inputs, training=None):
        residual = self.downsample(inputs) #原来的x
        
        conv1 = self.conv1(inputs)
        bn1 = self.bn1(conv1)
        relu1 = self.relu(bn1)
        conv2 = self.conv2(relu1)
        bn2 = self.bn2(conv2)
        
        add = layers.add([bn2, residual]) #shortcut
        out = self.relu(add) #等价于out = tf.nn.relu(add)
        return out

class ResNet(keras.Model):
    
    def __int__(self, layer_dims, num_classes=100): #[2,2,2,2]
        super(ResNet, self).__init__()
        
        self.stem = Sequential([layers.Conv2D(64,(3,3),strides=(1,1)),
                                layers.BatchNormalization(),
                                layers.Activation('relu'),
                                layers.MaxPool2D(pool_size=(2,2),strides=(1,1),padding='same')])
        self.layer1 = self.build_resblock(64, layer_dims[0])
        self.layer2 = self.build_resblock(128, layer_dims[1], stride=2)
        self.layer3 = self.build_resblock(256, layer_dims[2], stride=2)
        self.layer4 = self.build_resblock(512, layer_dims[3], stride=2)
        
        # output: [b, 512, h, w]
        self.avgpool = layers.GlobalAveragePooling2D() #功能层
        self.fc = layers.Dense(num_classes) 
        
            
        
    def call(self, inputs, trianing=None):
        x = self.stem(inputs)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        
        #[b,c]
        x = self.avgpool(x)
        x = self.fc(x)
        
        return x
        
    
    def build_resblock(self, filter_num, blocks, stride=1):
        #may downsample
        res_blocks = keras.Sequential()
        res_blocks.add(BasicBlock(filter_num, stride))
        
        for _ in range(1, blocks):
            res_blocks.add(BasicBlock(filter_num, stride=1))
        
        return res_blocks
    
def resnet18():
    
    return ResNet([2,2,2,2])

def resnet34():
    
    return ResNet([3,4,6,3])


2.resnet_train.py

import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
tf.random.set_seed(2345)
from resnet import resnet18

def preprocess(x, y):
    # [0~1]
    x = tf.cast(x, dtype=tf.float32) / 255. - 1
    y = tf.cast(y, dtype=tf.int32)
    return x, y

batchsz = 256
#[32, 32, 3], [10k, 1]
(x,y), (x_val, y_val) = datasets.cifar100.load_data()
y = tf.squeeze(y,axis=1)
y_val = tf.squeeze(y_val,axis=1) #注意维度变换
print(x.shape,y.shape,x_val.shape,y_val.shape)

train_db = tf.data.Dataset.from_tensor_slices((x,y))
train_db = train_db.shuffle(1000).map(preprocess).batch(batchsz)

test_db = tf.data.Dataset.from_tensor_slices((x_val,y_val))
test_db = test_db.map(preprocess).batch(batchsz)

sample = next(iter(train_db))
print('batch: ', sample[0].shape, sample[1].shape)

def main():
    
    model = resnet18()
    model.summary()
    model.build(input_shape=(None,32,32,3))
    optimizer = optimizers.Adam(lr=1e-4)
    
    #拼接需要训练的参数 [1,2] + [3,4] = [1,2,3,4]
    for epoch in range(50):
        
        for step, (x,y) in enumerate(train_db):
            
            with tf.GradientTape() as tape:
                #[b,32,32,3] => [b,1,1,512]
                logits = model(x)
                
                y_onehot = tf.one_hot(y, depth=100) #[50k, 10]
               # y_val_onehot = tf.one_hot(y_val, depth=100)
                
                loss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True)
                loss = tf.reduce_mean(loss)
                
            grads = tape.gradient(loss, model.trainable_variables)
            
            optimizer.apply_gradients(zip(grads, model.trianabel_variables))
            
            if step % 100 == 0:
                print(epoch, step, 'loss: ', float(loss))
            
        total_num = 0
        total_correct = 0
        for x, y in test_db:
            logits = model(x)
            prob = tf.nn.softmax(logits, axis=1)
            pred = tf.argmax(prob, axis=1)
            pred = tf.cast(pred, dtype=tf.int32)
            correct = tf.cast(tf.equal(pred, y), dtype=tf.int32)
            correct = tf.reduce_sum(correct)
            total_num += x.shape[0]
            total_correct += int(correct)
            
        acc = total_correct / total_num
        print('acc: ',acc)
        
if __name__ == '__main__':
    main()

代码借鉴了网易云课堂龙老师的tensorflow2.0教材,仅供交流使用.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow2.0 搭建简单的ResNet和训练 的相关文章

随机推荐

  • docker安装图形化管理界面

    首先看下这个界面的样子 还是比较好看 xff0c 而且在同一个局域网中都可以登录进行管理 说下安装教程吧 首先下载这个镜像 xff1a sudo docker pull portainer portainer 然后创建这个容器 sudo d
  • JSP小脚本学习

    小脚本 可以将任何数量的小脚本包含在页面中 xff0c 小脚本是有效的JAVA语言语句 xff0c 变量或方法声明或表达式 小脚本的语法 xff0c lt code fragment gt 入门示例 xff1b lt 64 page lan
  • 34. 在排序数组中查找元素的第一个和最后一个位置(C语言)

    笨办法 xff0c 先找第一个等于target的位置 xff0c 再找最后一个等于target的位置 Note The returned array must be malloced assume caller calls free int
  • 详解如何将TensorFlow训练的模型移植到Android手机

    前言 本文中出现的TF皆为TensorFlow的简称 先说两句题外话吧 xff0c TensorFlow 前两天热热闹闹的发布了正式版r1 0 xff0c 可感觉自己才刚刚上手 r0 12 xff0c 这个时代发展的太快 xff0c 脚步是
  • ROS实践手册(一)ROS安装教程

    笔者根据 古月居 ROS入门21讲 学习整理 xff0c 并参考 ROS机器人开发实践 一书 虚拟机安装 注 该部分可参考 古月居 ROS入门21讲 第2讲下载并安装 VMware Workstation Pro下载 Ubuntu18 04
  • Shell系统学习之如何执行Shell程序

    系列文章目录 Shell系统学习之什么是Shell Shell系统学习之创建一个Shell程序 Shell系统学习之向Shell脚本传递参数 Shell系统学习之如何执行Shell程序 Shell系统学习之Shell变量和引用 Shell系
  • target_link_libraries接口的使用

    target link libraries需要放在add executable之后 xff0c 用于指明连接进来的库 xff0c 官方推荐使用这个接口 xff0c 而不推荐使用link libraries xff0c link librar
  • TTL和RS232之间的详细对比

    背景 之前就听过TTL xff0c 一直没搞懂其和RS232的区别 最近 xff0c 打算去买个USB转RS232的芯片 xff0c 结果找到此产品 xff1a 六合一多功能USB转UART串口模块CP2102 usb TTL485 232
  • STL 解算法题目例子

    STL解算法题目例子
  • 双子天蝎,爱情是不老的传说

    双子天蝎 xff0c 爱情是不老的传说 自注 此文章乃双子座所写 定有主观上的个人倾向 转帖者 xff1a 就是我啦 xff0c 一个双子座的帅哥 xff08 自封 xff09 关于双子和天蝎 xff0c 我是很想很完整的写一些 xff0c
  • ASP2.0-130道ASP.NET面试题

    1 简述 private protected public internal 修饰符的访问权限 答 private 私有成员 在类的内部才可以访问 protected 保护成员 xff0c 该类内部和继承类中可以访问 public 公共成员
  • opencv 图像去噪学习总结

    OpenCV图像处理篇之图像平滑 图像平滑算法 程序分析及结果 图像平滑算法 图像平滑与图像模糊是同一概念 xff0c 主要用于图像的去噪 平滑要使用滤波器 xff0c 为不改变图像的相位信息 xff0c 一般使用线性滤波器 xff0c 其
  • Ubuntu18.04 装系统、cuda、cudnn,主要是Ubuntu的内核版本不能太高,亲测很成功

    一 装系统 简单的我就不说了 xff0c 之说要点 1 选择为图形或无线硬件 安装第三方软件 2 在安装类型中 xff0c 选择其他选项 3 分区 xff0c 我选择分区2 3个 EFI分区 xff0c 主空间 xff0c 空间起始位置 x
  • 被透明元素遮挡的元素还可以被点击到吗?

    遮挡 关于是否被遮挡的判断 xff0c 可以从对层叠级别的判断而确定 见 xff1a 说说标准 CSS核心可视化格式模型 visual formatting model 之十三 xff1a 分层的显示 Layered presentatio
  • 闲谈两句windows,linux

    今天无意在一个群里说了一句 34 我觉得ubuntu比vista还好用 34 马上引来一帮人的反击 xff0c 所用伎俩仍然没有新意 1偷换概念 xff0c 开始用winxp说事 2游戏 xff0c 网银 3windows的系统很稳定 xf
  • python类的基本操作

    本节给出类的基本操作函数 xff0c 方法查阅备用 0 定义类 span class token keyword class span span class token class name student span span class
  • python的异常类型

    1 内建的异常类 异常类含义Exception所有异常的基类AttributeError特性引用或赋值失败引发IOError试图打开不存在文件 包括其他情况 时引发IndexError使用序列中不存在的索引时引发KeyError在使用映射时
  • TFLearn代码示例

    span class token keyword import span tflearn span class token keyword from span tflearn span class token punctuation spa
  • 爬虫爬取大学排名示例

    span class token comment coding utf 8 span span class token triple quoted string string 34 34 34 Created on Wed Nov 7 19
  • TensorFlow2.0 搭建简单的ResNet和训练

    1 resnet py span class token keyword import span os span class token keyword import span tensorflow span class token key