【深度学习】残差网络 ResNet 的 tensorflow 简单实现(没有使用 slim)

本文提供了一个简单的 TensorFlow 实现 ResNet 的教程,不使用 slim 库。详细介绍了 ID_block 和 CONV_block 的代码实现,并展示了整体架构。虽然准确性不高,但可作为加深理解 ResNet 结构的基础示例。
摘要由CSDN通过智能技术生成

残差网络 ResNet 的 tensorflow 简单实现

前言

和前面几篇一样,这个也是没有使用到 slim 的朴素 tensorflow 实现,重复造轮子,大概是因为懒。
图片及代码参考来源于此
首先是 ResNet 的整体架构,由普通的 CNN 网络 + 一些残差路径而已。在这里插入图片描述
上图中,把残差块分为了 CONV BLOCK 和 ID BLOCK 区别如下。
ID BLOCK 的残余项就是 X,直接短路即可,如下图。在这里插入图片描述

而CONV BLOCK 要对 X 进行一个卷积操作,再连接残余项,如下图。在这里插入图片描述
准确率不太高,但也懒得调了。算了吧。
在这里插入图片描述
那接下来就可以直接上代码了。

ID_block 定义代码

def ID_block(X, channels_in, kernel_channels, is_training, name = 'ID_block'):
    conv1 = conv_layer(X, 1, 1,  channels_in, kernel_channels, is_training, name + '/conv1')
    conv2 = conv_layer(conv1, 3, 1, kernel_channels, kernel_channels, is_training, name + '/conv2')
    conv3 = conv_layer(conv2, 1, 1, kernel_channels, channels_in, is_training, name + '/conv3', False)
    
    add = tf.add(conv3, X)
    result = tf.nn.relu(add)
    return result

CONV_block 定义代码

def CONV_block(X, channels_in, channels_out, is_training, name = 'CONV_block'):
    conv1 = conv_layer(X, 1, 1,  channels_in, channels_out, is_training, name + '/conv1')
    conv2 = conv_layer(conv1, 3, 1, channels_out, channels_out, is_training, name + '/conv2')
    conv3 = conv_layer(conv2, 1, 1, channels_out, channels_out, is_training, name + '/conv3', False)
    
    short_cut = conv_layer(X, 3, 1,  channels_in, channels_out, is_training, name + '/short_cut', False)
    
    add = tf.add(conv3, short_cut)
    result = tf.nn.relu(add)
    return result

完整代码

由于我的数据相对简单,所以就跑了一下浅层的 ResNet,可以对应自己的数据,增加几层。

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
os.system("rm -r logs")
import tensorflow as tf
get_ipython().run_line_magic('matplotlib', 'inline')
import matplotlib.pyplot as plt 
from PIL import Image
# import multiprocessing
from multiprocessing import Process
import threading
import time


# In[2]:



TrainPath = '/home/winsoul/disk/MyML/data/tfrecord/train.tfrecords'
ValPath = '/home/winsoul/disk/MyML/data/tfrecord/val.tfrecords'


# In[3]:


def read_tfrecord(TFRecordPath):
    with tf.Session() as sess:
        feature = {
   
            'image': tf.FixedLenFeature([], tf.string),
            'label': tf.FixedLenFeature([], tf.int64)
        }
#         filename_queue = tf.train.string_input_producer([TFRecordPath], num_epochs = 1)
        filename_queue = tf.train.string_input_producer([TFRecordPath]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值