Inception4的tensorflow实现,主要借助nn模块

实现inception4网络,这是googlenet与resnet结合的卷积神经网络。

本文按照论文复现,论文中的InceptionA,InceptionB,InceptionC,以及reduction模块已写入函数,此次也将卷积函数简化,具体见demo:

# -*- coding: utf-8 -*-
"""
Created on Fri May 31 2019
@author: Ruoyu Chen
The Inceptionv4 networks
"""
import tensorflow as tf
 
BATCH_SIZE = 10
 
 
def weight_variable(shape, name=None):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial, name)
 
 
def bias_variable(shape, name=None):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial, name)
 
 
def conv2d(input, filter, strides, padding="SAME", name=None):
    # filters with shape [filter_height * filter_width * in_channels, output_channels]
    # Must have strides[0] = strides[3] =1
    # For the most common case of the same horizontal and vertices strides, strides = [1, stride, stride, 1]
    '''
    Args:
        input: A Tensor. Must be one of the following types: float32, float64.
        filter: A Tensor. Must have the same type as input.
        strides: A list of ints. 1-D of length 4. The stride of the sliding window for each dimension of input.
        padding: A string from: "SAME", "VALID". The type of padding algorithm to use.
        use_cudnn_on_gpu: An optional bool. Defaults to True.
        name: A name for the operation (optional).
    '''
    return tf.nn.conv2d(input, filter, strides, padding=padding, name=name)  # padding="SAME"用零填充边界

def Conv(input, name, filter_size, bias_size, stride, padding = 'SAME'):
    with tf.name_scope(name):
        with tf.name_scope('Variable'):
            filters = weight_variable(filter_size, name='filter')
            bias = weight_variable(bias_size, name='bias')
        with tf.name_scope("Convolution"):
            layer = tf.nn.relu(conv2d(input, filters, strides=stride, padding = padding) + bias)
    return layer

def stem(image):
    # input shape(299,299,3)
    with tf.name_scope('steam'):
        net = Conv(input=image, name = 'Layer1', filter_size = [3,3,3,32], bias_size = [32],padding = 'VALID', stride = [1,2,2,1])
        net = Conv(input=net, name = 'Layer2', filter_size = [3,3,32,32], bias_size = [32], padding = 'VALID', stride = [1,1,1,1])
        net = Conv(input=net, name = 'Layer3', filter_size = [3,3,32,64], bias_size = [64], padding = 'SAME', stride = [1,1,1,1])
        with tf.name_scope('MaxPool_1'):
            maxpool = tf.nn.max_pool(net, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding="VALID",name='maxpool')
        net = Conv(input=net, name = 'Layer4', filter_size = [3,3,64,96], bias_size = [96], padding="VALID", stride = [1,2,2,1])
        with tf.name_scope('Filter_concat_1'):
            net = tf.concat([maxpool, net], 3)
        net_1 = Conv(input=net, name = 'Layer5_1', filter_size = [1,1,160,64], bias_size = [64], padding="SAME", stride = [1,1,1,1])
        net_1 = Conv(input=net_1, name = 'Layer6_1', filter_size = [3,3,64,96], bias_size = [96], padding="VALID",stride = [1,1,1,1])
        net_2 = Conv(input=net, name = 'Layer5_2', filter_size = [1,1,160,64], bias_size = [64], stride = [1,1,1,1])
        net_2 = Conv(input=net_2, name = 'Layer6_2', filter_size = [7,1,64,64], bias_size = [64], stride = [1,1,1,1])
        net_2 = Conv(input=net_2, name = 'Layer7_2', filter_size = [1,7,64,64], bias_size = [64], stride = [1,1,1,1])
        net_2 = Conv(input=net_2, name = 'Layer8_2', filter_size = [3,3,64,96], bias_size = [96], padding="VALID", stride = [1,1,1,1])
        with tf.name_scope('Filter_concat_2'):
            net = tf.concat([net_1, net_2], 3)
        net_1 = Conv(input=net, name = 'Layer9', filter_size = [3,3,192,192], bias_size = [192], padding="VALID", stride = [1,2,2,1])
        with tf.name_scope('MaxPool_2'):
            maxpool = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="VALID",name='maxpool')
        with tf.name_scope('Filter_concat_3'):
            net = tf.concat([net_1, maxpool], 3)
    return net

def inception_A(input, name):
    input_shape=input.get_shape().as_list()
    with tf.name_scope(name):
        with tf.name_scope('Average_Pool'):
            avg = tf.nn.avg_pool(input, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding="SAME",name='avgpool')
        net1 = Conv(input=avg, name = 'Layer1_1', filter_size = [1,1,input_shape[3],96], bias_size = [96],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=input, name = 'Layer2_1', filter_size = [1,1,input_shape[3],96], bias_size = [96],padding = 'SAME', stride = [1,1,1,1])
        net3 = Conv(input=input, name = 'Layer3_1', filter_size = [1,1,input_shape[3],64], bias_size = [64],padding = 'SAME', stride = [1,1,1,1])
        net3 = Conv(input=net3, name = 'Layer3_2', filter_size = [3,3,64,96], bias_size = [96],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=input, name = 'Layer4_1', filter_size = [1,1,input_shape[3],64], bias_size = [64],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_2', filter_size = [3,3,64,96], bias_size = [96],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_3', filter_size = [3,3,96,96], bias_size = [96],padding = 'SAME', stride = [1,1,1,1])
        with tf.name_scope('Filter_concat'):
            net = tf.concat([net1, net2, net3, net4], 3)
    return net

def Reduction_A(input, n, k, I, m):
    input_shape=input.get_shape().as_list()
    with tf.name_scope('ReductionA'):
        with tf.name_scope('MaxPool'):
            maxpool = tf.nn.max_pool(input, ksize=[1, 3, 3, 1], strides=[1, 2,2, 1], padding="VALID",name='MaxPool')
        net1 = Conv(input=input, name = 'Layer1', filter_size = [3,3,input_shape[3],n], bias_size = [n],padding = 'VALID', stride = [1,2,2,1])
        net2 = Conv(input=input, name = 'Layer2_1', filter_size = [1,1,input_shape[3],k], bias_size = [k],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=net2, name = 'Layer2_2', filter_size = [3,3,k,I], bias_size = [I],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=net2, name = 'Layer2_3', filter_size = [3,3,I,m], bias_size = [m],padding = 'VALID', stride = [1,2,2,1])
        with tf.name_scope('Filter_concat'):
            net = tf.concat([maxpool ,net1, net2], 3)
    return net

def inception_B(input, name):
    input_shape=input.get_shape().as_list()
    with tf.name_scope(name):
        with tf.name_scope('Average_Pool'):
            avg = tf.nn.avg_pool(input, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding="SAME",name='avgpool')
        net1 = Conv(input=avg, name = 'Layer1_1', filter_size = [1,1,input_shape[3],128], bias_size = [128],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=input, name = 'Layer2_1', filter_size = [1,1,input_shape[3],384], bias_size = [384],padding = 'SAME', stride = [1,1,1,1])
        net3 = Conv(input=input, name = 'Layer3_1', filter_size = [1,1,input_shape[3],192], bias_size = [192],padding = 'SAME', stride = [1,1,1,1])
        net3 = Conv(input=net3, name = 'Layer3_2', filter_size = [1,7,192,224], bias_size = [224],padding = 'SAME', stride = [1,1,1,1])
        net3 = Conv(input=net3, name = 'Layer3_3', filter_size = [7,1,224,256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=input, name = 'Layer4_1', filter_size = [1,1,input_shape[3],192], bias_size = [192],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_2', filter_size = [1,7,192,192], bias_size = [192],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_3', filter_size = [7,1,192,224], bias_size = [224],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_4', filter_size = [1,7,224,224], bias_size = [224],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_5', filter_size = [7,1,224,256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        with tf.name_scope('Filter_concat'):
            net = tf.concat([net1, net2, net3, net4], 3)
    return net

def Reduction_B(input):
    input_shape=input.get_shape().as_list()
    with tf.name_scope('ReductionB'):
        with tf.name_scope('MaxPool'):
            maxpool = tf.nn.max_pool(input, ksize=[1, 3, 3, 1], strides=[1, 2,2, 1], padding="VALID",name='MaxPool')
        net1 = Conv(input=input, name = 'Layer1_1', filter_size = [1,1,input_shape[3],192], bias_size = [192],padding = 'SAME', stride = [1,1,1,1])
        net1 = Conv(input=net1, name = 'Layer1_2', filter_size = [3,3,192,192], bias_size = [192],padding = 'VALID', stride = [1,2,2,1])
        net2 = Conv(input=input, name = 'Layer2_1', filter_size = [1,1,input_shape[3],256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=net2, name = 'Layer2_2', filter_size = [1,7,256,256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=net2, name = 'Layer2_3', filter_size = [7,1,256,320], bias_size = [320],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=net2, name = 'Layer2_4', filter_size = [3,3,320,320], bias_size = [320],padding = 'VALID', stride = [1,2,2,1])
        with tf.name_scope('Filter_concat'):
            net = tf.concat([maxpool, net1, net2], 3)
    return net

def inception_C(input, name):
    input_shape=input.get_shape().as_list()
    with tf.name_scope(name):
        with tf.name_scope('Average_Pool'):
            avg = tf.nn.avg_pool(input, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding="SAME",name='avgpool')
        net1 = Conv(input=avg, name = 'Layer1_1', filter_size = [1,1,input_shape[3],256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net2 = Conv(input=input, name = 'Layer2_1', filter_size = [1,1,input_shape[3],256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net3 = Conv(input=input, name = 'Layer3_1', filter_size = [1,1,input_shape[3],384], bias_size = [384],padding = 'SAME', stride = [1,1,1,1])
        net3_1 = Conv(input=net3, name = 'Layer3_2_1', filter_size = [1,3,384,256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net3_2 = Conv(input=net3, name = 'Layer3_2_2', filter_size = [3,1,384,256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=input, name = 'Layer4_1', filter_size = [1,1,input_shape[3],384], bias_size = [384],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_2', filter_size = [1,3,384,448], bias_size = [448],padding = 'SAME', stride = [1,1,1,1])
        net4 = Conv(input=net4, name = 'Layer4_3', filter_size = [3,1,448,512], bias_size = [512],padding = 'SAME', stride = [1,1,1,1])
        net4_1 = Conv(input=net4, name = 'Layer4_4_1', filter_size = [3,1,512,256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        net4_2 = Conv(input=net4, name = 'Layer4_4_2', filter_size = [1,3,512,256], bias_size = [256],padding = 'SAME', stride = [1,1,1,1])
        with tf.name_scope('Filter_concat'):
            net = tf.concat([net1, net2, net3_1, net3_2, net4_1, net4_2], 3)
    return net

def layer(input, name, size):
    input_shape=input.get_shape().as_list()
    with tf.name_scope(name):
        with tf.name_scope('Variable'):
            W = weight_variable([input_shape[1], size], name='Weight')
            bias = weight_variable([size], name='bias')
        with tf.name_scope("layer"):
            layer = tf.nn.relu(tf.matmul(input, W, name='layer') + bias)
    return layer

def Inception_v4(input, keep_prob=0.8):
    '''参考论文: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning'''
    # input_size:(299,299,3)
    net = stem(input)
    net = inception_A(net, 'Inception_A1')
    net = inception_A(net, 'Inception_A2')
    net = inception_A(net, 'Inception_A3')
    net = inception_A(net, 'Inception_A4')
    net = Reduction_A(net, n = 96, k = 96, I = 224, m = 256)
    net = inception_B(net, 'Inception_B1')
    net = inception_B(net, 'Inception_B2')
    net = inception_B(net, 'Inception_B3')
    net = inception_B(net, 'Inception_B4')
    net = inception_B(net, 'Inception_B5')
    net = inception_B(net, 'Inception_B6')
    net = inception_B(net, 'Inception_B7')
    net = Reduction_B(net)
    net = inception_C(net, 'Inception_C1')
    net = inception_C(net, 'Inception_C2')
    net = inception_C(net, 'Inception_C3')
    with tf.name_scope('Average_Pooling'):
        net = tf.nn.avg_pool(net, ksize=[1, 8, 8, 1], strides=[1, 1, 1, 1], padding="VALID",name='avgpool')
        net = tf.reshape(net,[-1,1536])
    with tf.name_scope('Dropout'):
        net = tf.nn.dropout(net, keep_prob)
    with tf.name_scope('Softmax'):
        net = layer(net, name='Layer', size = 1000)
    return net
 
def backward(datasets, label, test_data, test_label):
    with tf.name_scope('Input_data'):
        X = tf.placeholder(tf.float32, [None, 299, 299, 3], name="Input")
        Y_ = tf.placeholder(tf.float32, [None, 1], name='Estimation')
    LEARNING_RATE_BASE = 0.00001  # 最初学习率
    LEARNING_RATE_DECAY = 0.99  # 学习率的衰减率
    LEARNING_RATE_STEP = 1000  # 喂入多少轮BATCH-SIZE以后,更新一次学习率。一般为总样本数量/BATCH_SIZE
    gloabl_steps = tf.Variable(0, trainable=False)  # 计数器,用来记录运行了几轮的BATCH_SIZE,初始为0,设置为不可训练
    learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, gloabl_steps, LEARNING_RATE_STEP,
                                               LEARNING_RATE_DECAY, staircase=True)
    keep_prob = tf.placeholder(tf.float32, name="keep_prob")
    y = VGG16(X)
    global_step = tf.Variable(0, trainable=False)
    with tf.name_scope('Accuracy'):
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(Y_, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    with tf.name_scope('loss'):
        loss_mse = tf.reduce_mean(-tf.reduce_sum(Y_ * tf.log(y), reduction_indices=[1]))
        tf.summary.scalar('loss', loss)
    with tf.name_scope('train'):
        train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)
    saver = tf.train.Saver()
    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        writer = tf.summary.FileWriter("./logs", sess.graph)
        sess.run(init_op)
        # 训练模型。
        STEPS = 500001
        min_loss = 1
        for i in range(STEPS):
            start = (i * BATCH_SIZE) % len(datasets)
            end = start + BATCH_SIZE
            if i % 100 == 0:
                run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
                run_metadata = tf.RunMetadata()
                summary_str, step, _ = sess.run([merged, gloabl_steps, train_step],
                                                feed_dict={X: datasets[start:end], Y_: label[start:end], keep_prob:1.0},
                                                options=run_options, run_metadata=run_metadata)
                writer.add_summary(summary_str, i)
                writer.add_run_metadata(run_metadata, 'step%d' % (i))
                test_accuracy = accuracy.eval(feed_dict={X: test_data, Y_: test_label, keep_prob: 1.0})
                print("After %d training step(s), accuracy is %g" % (i, test_accuracy))
                saver.save(sess, './logs/variable', global_step=i)
            else:
                summary_str, step, _ = sess.run([merged, gloabl_steps, train_step],
                                                feed_dict={X: datasets[start:end], Y_: label[start:end]})
                writer.add_summary(summary_str, i)
 
 
def main():
    with tf.name_scope('Input_data'):
        X = tf.placeholder(tf.float32, [None, 299, 299, 3], name="Input")
    keep_prob = tf.placeholder(tf.float32, name="keep_prob")
    y = Inception_v4(X, keep_prob)
    sess = tf.Session()
    writer = tf.summary.FileWriter("./logs", sess.graph)
    writer.close()
 
 
if __name__ == '__main__':
    main()

直接运行demo,将得到logs文件夹,运行tensorboard(注意,logs所在路径绝对不能带中文!)即可得到graph的具体图。由于图片过大无法下载,此处不再展示全部。

Steam模块的图:

InceptionA:

 

InceptionB:

InceptionC:

ReductionA: 

ReductionB: 

如果需要训练请具体修改main里面函数,运行backward函数。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Inception v4是一种卷积神经网络模型,它是Google在2016年提出的。它是Inception系列模型的最新版本,具有更好的性能和更高的准确性。PyTorch是一种深度学习框架,它可以用来实现Inception v4模型。要实现Inception v4模型,需要使用PyTorch的卷积神经网络模块和其他相关模块。可以通过编写PyTorch代码来实现Inception v4模型,并使用训练数据对模型进行训练,以获得更好的性能和准确性。 ### 回答2: Inception V4 是 Google 在 2016 年提出的一种卷积神经网络模型,通过结合多种不同尺度和分支的卷积神经网络层来最大化特征的提取。而 Pytorch 则是一个流行的深度学习框架,其提供了大量有效而灵活的工具来实现各种深度学习模型。因此,实现 Inception V4 模型的 Pytorch 版本很有意义。 首先,需要了解 Inception V4 模型的架构。该模型的架构对于实现来说比较复杂,包含了各种卷积、池化、批标准化、ReLU 激活和分支等操作。其中,主要的组件包括 Inception Module,Reduction Module 和 Stem Layer,而所有的组件通过连接形成了一个大的神经网络结构。在实现 Inception V4 的过程中,我们需要按照架构,把这些组件实现和连接起来。在实现中可以使用 Pytorch 中的相应模块和函数,如 nn.Conv2d() 用于卷积操作,nn.MaxPool2d() 用于池化操作,nn.BatchNorm2d() 用于批标准化等。 其次,Pytorch 实现 Inception V4 模型的过程中需要注意的一些问题。在实现过程中,需要根据架构的设计、网络的输入和输出特征维度等因素,调整相应的超参数和模块。例如,在 Stem Layer 中,需要根据输入的特征维度设置合适的卷积核和步长等参数。此外,还需要注意模型训练时的初始化、优化器的选择和超参数的设置等问题。 最后,在实现 Inception V4 模型的过程中,可以参考 Pytorch 官方文档和相关论文,了解 Inception V4 的架构设计以及模型训练和调优的技巧。此外,还可以参考 Github 上已有的开源代码库,如 implementation by szagoruyko 等等,从中学习实现的技巧和经验。 总之,实现 Inception V4 模型的 Pytorch 版本需要掌握相应的知识和技能,包括架构设计、模块使用、超参数设置、初始化和优化等方面。通过不断地学习和实践,可以掌握构建和实现深度学习模型的基本能力。 ### 回答3: Inception v4是Google在2016年提出的最新版本的Inception系列网络,它在保持Inception v3主干结构的基础上,对网络中的若干模块进行了改进,从而达到更高的性能和更好的泛化能力。在PyTorch框架下,实现Inception v4模型的方法如下: 1.导入PyTorch相关库和模块,包括torch、torchvision、Inception系列模块等。 2.定义Inception v4中的若干模块,包括Inception-A、Inception-B、Inception-C模块等。这些模块采用了不同的结构和参数设定,可灵活组合拼接,从而构建不同层次的网络结构。 3.定义完整的Inception v4网络结构,包括主干结构和辅助分类器等。主干结构由若干个基本模块(如Inception-A、Inception-B、Inception-C等)按照特定的顺序组成,其中包括卷积层、批处理归一化层、池化层等。辅助分类器用于提高网络的性能和稳定性,它一般位于主干结构中间某个位置,输出中间特征图,可用于监督和优化网络训练过程。 4.训练Inception v4模型,包括选择合适的损失函数、学习率策略、优化器等。训练过程一般分为两个阶段:在Imagenet数据集上进行预训练,以及在具体应用领域上进行微调。 5.应用Inception v4模型,包括测试和预测等。在测试阶段,可通过网络预测输入图片的类别,并计算分类准确率等指标;在预测阶段,可利用训练好的模型,对新的未知数据进行分类和识别。 总的来说,采用PyTorch实现Inception v4模型,需要熟练掌握相关的深度学习知识和PyTorch框架,从而能够理解和运用Inception系列模块、卷积层、批处理归一化层、池化层等常用的网络结构和参数设定,同时需要具备数据预处理、损失函数、优化器等相关技术的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值