建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

Yiakwy

发帖: 1粉丝: 10

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-14 00:55:20 1175 8 楼主 显示全部楼层
[技术分享] 八分音符算子-北京颜水成教授办公室【神经网络基石-组网-算子篇】

八分音符(频率)卷积算子 Octave Convolution

==== 我是分割线(略过分割线,即是正文) ====

 === 标签 ===

卷积神经网络,算子分析,认知科学,频谱分析,快速傅里叶变换

 

 === 前奏 ===

为什么读此系列文章?

优化数学和计算理论帮助机器学习完成了问题分类:


1)按照领域划分,比如计算机视觉,自然语言处理,推荐,统计分析预测策略; 

2)按照算法复杂划分,比如是否是NP-Hard问题,是否需要精确解;

3)按照方法分类,监督性学习问题,非监督性学习问题,半监督性学习模型,和有先验信息的交互学习模型;

4)按照研模型分类,比如基于代数线性表出理论、基理论的线性模型,基于决策树的树状非线性模型,基于Kernel理论的非线性模型,基于编码解码器的神经网络;


逐渐形成以数据为主轴,离线训练算法,在线推理的机器学习模型离开刀耕火种,进入春秋百家争鸣时代。这一时期,监督性学习理论高速增长,以逻辑回归,SVM,Convolution Neural Network,RNN迅速在子领域占领重要的一席之地。


这是一个幸福的时代,实际上每个子领域,都已经形成成熟的方法论,像


从Tensorflow开始,我意识的这已经从春秋,进入战国时代。针对大量数据的存储、ETL、和分布式计算的平台,针对机器学习的软件架构实现比如PaddlePaddle、Tensorflow,针对业务场景的端设备优化比如针对于GPU设备TensorRT,针对CPU设备的Intel® OpenVino™,针对计算资源虚拟化、计算能力服务化的云平台,会扮演着越来越重要的作用。很有可能未来,在算法领域算法工程师和软件工程师,很有可能是从不同方向,成长起来的同一批人。所以我们需要了解,研究工业框架底层模型,到底是如何实现,实现从输入到输出的价值提取。

本系列文章包含哪些内容?

本系列文章,旨在通过扎实的实现的纵向优化,工业级代码框架的横向比较,透视、分析神经网络架构撰写技巧,方法和思路,正确使用神经网络工具,解决实际生成问题:

  1. 数据篇:数据集编写,训练、测试数据预处理技术,图像数据正则化技巧,ZCA白化技术;带标注的训练数据增强,其中标注包含以下可能的数据类型:BBounding Box, Mask, Key Points, Feature Descriptor。还包括Anchor size等相关超参数估计技巧。无数据无监督性学习算法。

  2. 网络结构篇:组网手段,各个网络的优势,和loss函数的书写技巧:比如CNN网络如何根据业务实时性选择特征提取层,不同尺度大小目标的特征提取,ROI编码等;再比如将回归问题转化为分类问题,给定一个预估值,动态计算上确界,和下确界,并极大化预估值落入区间的概率,极小化双向溢出率,通过分位数回归来计算loss实现任意非标准分布的强拟合;我们将重点关注,全连接网络,卷积网络,网络搜索(NAS),图网络的实现方法,和撰写技巧。

  3. 算子篇:具体的算子的实现。比如IoU, GIoU, 我实现的UIoU;再比如卷积块实现,金字塔特征FP实现,残差块实现;在比如卷积核反向传播算法,空洞卷积反向传播算法

  4. 求解器篇:求解器实现策略, 和相关数学原理。实际上神经网络的求解器涉及的技术和理论还是比较局限的,主要通过heuristic以梯度贪心,参数可行域无限制,参数间无约束关系(比如图连接)因此较为简单;比如Wolf-Powell定理及其实现,用于判定搜索是否可收敛;在拟牛顿法理论二次加速原理,及其局限性和相关近似算法;在比如理论上任网络可以使用另外一个非线性模型代替全连接层FC用来学习,比如SVM,GBDT等;BOOSTING技巧,有趣的AdaBoost;整数优化拓展,实际上离散优化和非离散优化的数学技术有很大的不同,是否可以神经网络架构搜索映射到0-1整数规划,一个值得思考的问题!更复杂的优化求解器技术,参数可行域受限,以参数间以图连接为约束,包含时间窗口约束,则需要更为完善的数学理论。这里我推荐Google OR tools来学习LP, MLP, VRPT(C)进行相关问题求解。

  5. 计算图:计算图将上述类容串接,形成一个完成的计算骨架。从2015年Dean Jeff等人的文章《Large Scale Deep Learning with Tensorflow》, 计算图不仅仅包含自动微分,还包含分布式思想中的算子算力划分,数据并行,和模型并行的加速思想在里面。自动微分已经被人们完全掌握,比如基于Numpy的AutoGrad, 实现一个自动微分已经不难。但是实现一个能够进行上述在异构设备上进行算力划分, 执行不同并发策略是十分困难的。计算图不仅仅是针对于深度学习设计的计算骨架,而是针对于一般科学计算的计算骨架。比如可以利用Tensorflow实现经典的非监督学习KMeans++的Lloyd过程。当然计算图并不代表全部,科学计算骨架内容,又比如KMeans++的随即发生器,则更多涉及随机过程,概率分布的计算骨架。


为什我想写?

2019年通过姜老师的推荐,和华为ModelArts团队有接触,认识了陈亮老师等人。陈老师希望我来提高社区氛围,随后我就写了Vgg16, YoloV4(YoloV3)变种的实现,以及对ImageNet预训练网络的参数的利用方法。期间大家努力拼搏的精神,让我大受感动。我和清华大学出版社的编辑讨论,也觉得围绕机器学习的架构是个很重要的点。


以往的书目,如华章教育从剑桥出版社引入的以色列科学家著的《深入理解机器学习,从算法到原理》(Understanding Machine Learning from Theory to Algorithms)作为研究生教程,有非常浓厚的数学理论的描述,过于艰涩:首先定义了机器学习的理论框架,以及所有理论服务于将模型编码到计算机上的根本目标;然后样本和总体的关系,定义一些评价由采样样本通过经验误差获得机器学习模型好坏的指标(Valiant提出PAC范式理论,于2010年获得图灵奖,诞生批处理算法并广泛运用于生产算法中,供业模型框架),进而通过找出尽量避免出现坏指标的规则,来设计可充分学习机器学习模型,并将机器学习的学习过程描述为一致收敛过程。接着该书分析了具体线性模型技术算法和一些高级技术。整个过程都是以伪代码和数学表达式来描述,没有明确的研究目标。在现在这种算法越来越专业,研究对象高度相关,算法质量要求越来越高的情况下,这种数学很难帮助学习者掌握1到2两个专业领域的核心技术,跟别说研究目标泛化机器学习体系了。


随后2015-2017年博视(BroadView),电子工业出版社围绕着Tensorflow,Caffe, Scipy推出了一大批《XX实践》图书。它们具有以下特点:

1)紧密围绕工具,讲解如何通过工具实现一个数据分析手段,从其行文可以看出主要面向非计算机专业方向的学生,从业人员。这导致他们容易受制于工具成为被一些高水平,尤其有计算机专业背景戏称为“调参侠”;

2)有代码的实现和讲解,但是仅限于实现比较简单的,大约1000行以内的模型;或者借助框架提供的优化器,算子建模求解,相对上面的著作缺乏批判性分析和相关实验过程及实验结论;或者过于简化问题,和Github已经开源实现、或者二次开源复现所提供的完整的问题框架相差太远;把一个完整的问题的不同步骤,分散到不同章节的不同问题里面,这是不利于学习和掌握的;

3)绝大多数图书包括《XX实践》,中关于神经网络,尤其是卷积网络都是浅尝辄止,和目前的高水平模型相差甚远,没有实用性:比如没有对预训练模型的利用,缺乏对数据源的分析,没有区分特征器提取问了包括VGG, ResNet, Inception, DarkNet,MobileNet速度,精确度,大小,架构的区别,没有对多目标检测诸多模块的分析,没有带标注数据数据增强相关的分析和思考。


2018年以问题为导向,面向面试的机器学习图书《百面机器学习》在京东售卖。这本书的书写作非常有趣,是先抛出一个问题,然后再寻求解决,类似美国大学课程Warm Up环节,其实和我的一些思考、过去的备课的内容不谋而合:


2018年我想改善机器学习面试体验。当时我通过我自己的渠道,已经收到了几十封简历,其中一些已经有相当资深的经验。受限HeadCount要求,我只能挑选一些刚毕业的学生,包括哥伦比亚大学毕业的,美国东北大学毕业,浙大毕业的,厦门大学毕业,华科大毕业的,北京邮电大大学毕业的朋友等。我结合自己的经验,我决定以问题为导向:我利用下班时间对简历进行coach后,面试中我给候选人准备了8道精心选择题目供他(她)3分钟内的选择,同时我又准备了20到题目根据前一步的选择,动态决定第二道题目选择,并和她沟通是否感兴趣。如果答得不是十分好,我会给一份课后作业,如果感兴趣,可以3天内完成的一个小Project。我同时我想HR,面试候选人做了些回访,无论结果如何,满意度还是非常高的。


在我之前面试要么是纯Code,主要考察计算机基础理论和算法,要么就是现场做数学推理并回答一些比较经典的问题,而我自己恰又是一个平时只有兴趣做最基本的训练,大块时间放在专业领域上,临场全靠即兴发挥的人,觉得这个面试流程还有很大的改进空间。事实上例如2009年MSRA出版的《编程之美》和上述《百面机器学习》都一个不足,就是看似十分机智的问题,其实都有专门的研究领域。在这个研究领域,只能算是浅尝辄止的问题和实践。比如最基本的Qick-Sort,若没有读过专门的学术著作,了解其不断改进的过程,一个新问题放在面前,是很难立即优化的(比如对不均匀分布数据块,甚至数据链表,加速Quick-Sort;比如通过随机化,剪枝技术,实现O(log(n))速度完成topK排序--传统方法利用小/大顶堆heap完成O(nlogk)速度排序;笔者在Github有相关解答),因为面试者缺乏研究积累。所以我希望面试应该在应试者的专业范围内循序渐进,这对于涵盖,统计学、运筹学、控制学、计算机工程的、计算图形学的交叉学科尤为重要,因为很难有人全部掌握,而且我们的职业发展也要求你精专一个或两个领域。


我仔细阅读了诸葛越女士做得序,发现这本书起于公众号的“Hulu机器学习问答”。因此我发现诸葛越女士似乎对“通用人工智能更感兴趣”,比如此书仍然更关注方法论,有非常强的数学属性在里面;书目同时涵盖了优化论,图模型,采样理论,全连接神经网络,深度卷积网络,深度残差网络,循环神经网络,树模型,强化学习,生成模型GAN。我们已经知道,Hulu是一个自制作剧目,并且售卖限时流媒体广告的公司,如果这本书能够从Hulu广告业务所对应的计算广告问题,视频网站相关的运营策略出发,比如推荐,曝光,排序问题,你会发现数据(有业务意义的埋点数据)所对应的处理方法(特征工程,采样,非均衡数据处理,离散特征编码),以及所选用的模型(可解释性)立刻有了明确的指向,方便我们清晰地理解整本书的组织架构。


我希望本系列文章以问题为导向,同时问题是一脉相承的,主线明确。系列文章的每一部分,是为了主线问题,进一步细化每一个步骤的处理方法,和相关研究,在力所能及的范围内完整的解决一个目标,掌握一两个技术,产生实际价值。

==== 我是分割线 ====


 === 正文 ===

Warmup

原始的卷积核及其BP算法,在2019年4月30公开的这篇名为"Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution"[1]的文章里,原始卷积成为“平凡的实现”(Vanilla implementation)。在考虑新提出的八分音符(频率)[5]卷积前,我们需要回顾下上一篇文章提到的卷积网络的卷积核理论,以及JPEG算法。


1. 卷积核理论回顾,如[文章](https://mp.weixin.qq.com/s/GKZeTrfTgRXmj29c_XouOQ)介绍:

filters x k x k卷积,作用在输入特征B x H x W x C,涉及: B*(k^2*C*h_nm_out*w_nm_out + (k^2-1)*C*h_nm_out*w_nm_out-1)次浮点计算。我们已经说明,卷积对应多项式乘法的系数表达式。由于n维多项式,根据代数基本定理,由n采样点唯一确定,得知多项式,由范德蒙矩阵决定。因此将多项式乘法,改由采样的点值乘积(O(n))表示后,就可以通过范德蒙矩阵的逆推算,多项式乘积的系数,即傅里叶变换的取值。


利用复根采样“重数折半”性质,根据主定理,FFT可以nlog(n)完成n阶多项式到采样值表示法:


1) img2col可用于加速dot算子,但FFT不能使用img2col,因为理论上k*k的卷积核,最多只需要k维傅里叶基就可以表示,利用傅里叶变换的可分离性(Separable)可以用两个一维傅里叶变换计算二维傅里叶变换。

2) 应用FFT到卷积核:H*W* (log(H) + log(W)) 

3) 应用FFT到输入:H*W* (log(H) + log(W))

4) 上面两个结果执行点乘计算: H*W

5) 应用逆FFT到上一步计算结果:H*W*(log(H) + log(W))

因此总浮点计算量(Flopts)为:B*(log(H) + log(W))*C*H*W


对于256*256的图像log(H) + log(W) ~ 16,当卷积核为5, 8时分别节省1.5, 4倍算力。


2. JPEG算法

在JPEG理论,图像的像素在空间域(Spatial Domain)是有关联性的。因此先算出每个channel的图像的均值,并平移该通道的图像,然后启用二维离散傅里叶变换将图像从空间域(Spatial Domain)转换到 频域 (Frequency Domain) -- 每个像素点,由不同频率的余弦波值叠加而成,得到的逆变换。我们将得到下图,此时图像像素间毫无相关性:即任意丢弃高频波信息,逆变换后不改变原图像纹理。这是以二维傅里叶变换作为基础的JPEG技术专利的核心概念之一。这里的傅里叶变换,就是我们通过卷积核(8x8)点乘输入特征。


Project_SF01.jpg

 图1:空间频率 Spatial Frequency (SF)[https://sites.uclouvain.be/goffauxlab/project_sf.html]


空间频谱图是对应频域低频傅里叶波函数。具体做法如下:


1) 将图像通过img2col展成一维图像

2) 用快速傅里叶变换,求得频域值

3) 将低频移到中心方便矩形滤波器,过滤

# /bin/python
import cv2
import numpy as np
import utils

# Read images with shape = (H,W)
...
# Perform 2-dimension fft (which implemented by two 1-dimension fft)
Freq2 = np.fft.fft2(img)

# Shift high frequency from bottom-right to center
Freq2_shift = np.fft.fftshift(Freq2)

# Perform frequencies crop and extraction
...


可以通过下面代码进行查看频谱图:

magnitude_spectrum = A * np.log(np.abs(fshift))

 

通过,剪裁,我们可以提取不同尺度的频谱特征。下面我提供了实验代码和结果(Colab: https://colab.research.google.com/drive/1Qy5hRRXUz_czN_PXofhZ60ivA9PnA_T7#scrollTo=fLmYabj7XbQP):


low_freq.png

图2:频谱空间低频特征提取

high_req.png

图3:频谱空间高频特征提取


high_freq_band.png

图4:频谱空间带特征提取


3. 频谱和方向作为不变特征

根据认知科学实验,视觉特征被分为,空间频谱(Spatial Frequency)和 朝向(Orientiation)[2]。大脑视觉皮层小的感受野被空间频谱和朝向分解激活,大的感受野被复杂的图形激活[2][3][4].


实验发现[空间频谱和朝向激活量可以被朝向特征和频谱特征的线性加权逼近[2], 且不同的皮质位置响应不同的频谱频率[2]。其中局部8梯度方向直方图检测,已经成为了SIFT特征用于图像处理多年。


高斯差分金字塔(DoG Pyramid)方法因此无论在仿生学上,还是实际计算中首先应用了多尺度特征提取的思想,已经接近日后的卷积块塔思想方法。尺度不变特征方法(SIFT)又进一步从朝向角度来寻找关键特征点,从而去定义图像特征。我们已经知道SIFT[6]的算法原理是有意义的,但是通过特征点来定义图像特征,已经不是我们现在的做法了。我们现在是通过神经网络编码器来输出图像的特征向量,精确度在包括ImageNet, Coco, VOC等数据集的比赛上已经超过了以往的所有方法。


本偏文章介绍的算子,从频谱角度出发,我猜想还可以从朝向进一步发掘,而这有历史过往图像特征提取方法,电子信号学数学物理方法,认知科学实验的坚实支撑。


Question & Answer

卷积网络由卷积块组成。每个卷积包含若干组卷积算子。卷积算子是可训练的,由卷积核,bias组成的待训练参数。怎么设计实验证明参数是有,或者没有冗余?需要哪些指标验证你的实验?


OctConv

八分音符卷积,将训练过程中已经接近卷积核算子的参数,分为高频,和低频部分存储,并沿Channle(通道)方向丢弃高频特征参数。由于傅里叶变换的线性特征,(H+L)conlv W ~ Output = H conlv W + L conlv W。记输出Output的高频部分为Output_H, 低频部分为Output_L执行Butter-Fly计算:

Output_H = Conlv(Inp_H, W_H) + Upsamle(Conlv(Inp_L, W_LH)) # Inp_H: HxW*(1-alpha)*Channel
Output_L = Conlv(inp_H, W_L) + Conlv(AveragePooling(X_H, 2), W_HL) # Inp_L: 0.5Hx0.5W*alpha*Channel feature size


这里沿通道方向丢弃参数十分有趣,如果我们观察以往的训练结果,不同的卷积核,可以对应不同的方向。本文主要是在不影响视觉特征的情况下,抑制高频特征。我期待从Channel角度,进一步分析方向特征的作用。


low-high-frequency.png

图5:图像频谱分解[1]


准确说,Output_H如前定义只和Output位置有关,例如靠近Output中心就是低频分解,靠近Output边缘就是高频分解。不考虑沿通道(Channel)方向按alpha比例分解,因此H 和 L是正交的因此H只对Output_H有贡献,L只对Output_L有贡献。但如果考虑了沿Channel方向分解,两者就不正交了,数值上也有体现。


图6:Octave Convolution计算过程[1]


对于Representation的研究,论文支出还见于Squeeze and Excitation Network(https://zpascal.net/cvpr2018/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.pdf)中的SE-Block模块。该论认为可以对卷积中的输出特征,用Embedding沿Channel方向压缩:


# # Keras Implemenation
def SEBlock(inp, ratio=16, name=''):    
    channel = K.int_shape(inp)[config.channel_axis] # Channel last   
    avpooling = GlobalAveragePooling2D(name='{}_seblock_avgpooling'.format(name))(inp)    
    # FC with channel / ratio as output channel
    fc1 = Dense(channel // ratio, activation='relu', name='{}_seblock_fc1'.format(name))(avpooling)    
    # FC with channel as output channel with sigmoid as activation
    fc2 = Dense(channel, activation='sigmoid', name='{}_seblock_fc2'.format(name))(y)
    # scale  
    output = Multiply(name='{}_seblock_mul'.format(name))([inp, fc2])    
    return output


但是SE-Block其显著增加了参数体积,和运算(FC层),应用并不广泛。OctConv从Channel方向来丢弃高频有异曲同工的作用,很明显但就方法上,OctConv更具优势。

    

图7:卷积核分解[1]


OctConv基于上述隐含假设,有了如下参数划分:


其中低频由0.5Hx0.5Wxalpha*Channel输入特征大小存贮卷积参数,高频由HxW*(1-alpha)*Channel输入特征大小存贮卷积参数。alpha为沿通道(Channel)方向的比例划分。因此我们根据这个,可以在进行计算量复杂度估计,约为

1-float(3)/4*alpha*(2-alpha) # 不考虑upsampling, 和 average pooling算子复杂度。

图8:输入特征频谱分解图[1]


这样划分,导致卷积核参数接触了更大范围的输入特征,从而间接增加了感受野大小。相反地,这将导致对小目标检测精度下降。


    表1:alhpa取0.5,通过Central Crop和Resize操作调整输入图片尺度对以ResNet-50架构模型的性能影响[1]

Screen Shot 2019-08-21 at 11.10.53 AM.png


理论计算没有考虑到Upsampling和Downsampling的计算量。实际计算效率和相关算子实现效率和参与程度有关。Facebook通过TVM给出了官方实现,其中1) https://github.com/facebookresearch/OctConv/blob/master/utils/symbol/symbol_resnetv2.py定义了实验Resnet组网;2) https://github.com/facebookresearch/OctConv/blob/master/utils/symbol/symbol_resblock.py定义了ResnetBlock组件,通过OctaveConvolution实现的ResnetBlock被记做BottleNeckV{1,2};实现方法是将标准残差连接块中的每个卷积块,由OctaveConvolution实现的卷积块代替;3)https://github.com/facebookresearch/OctConv/blob/master/utils/gluon/train_imagenet.py定义了训练入口,其中get_data_loader定义了数据预处理,和增强模块。


inference测试平台为Intel Skylake CPU 2.0 GHz (single thread)。TVM编译结果用来做对照实验(尚不清楚,TVM编译后的算子对实测量性能影响程度)。

论文实验分析解读

笔者认为思想上,如前面铺垫,这是非常有价值的思考方向和方法。我们发现源代码中,OctConv是作用在整个训练周期,因此在初始迭代策略上,卷积分解的分析可能不凑效。OctConv实验结论是


Screen Shot 2019-08-21 at 12.23.37 AM.png

图9:实验结果图


OctConv对感受野比较小的模型,精度有比较大的提升,同时减少了模型参数;对于常用模型,通过调整alpha,也能在减少模型参数的同时,提高精度。说明我们的卷积核确实包含冗余特征。

实验分析

如Warmup, 我们希望先设计下小的卷积块实验,根据OctConv中推理表达式,来观察训练过程Spatial Frequency分解能否满足正交。OctConv实验表明沿Channel方向丢掉一些高频特征参数,在某个channel比例因子下,有可能在减少参数的情况下,提升训练效果效果。沿用OctConv沿Channel通道丢弃高频参数框架,我们还希望了解,对于beta不同取值下得到的不同尺度的低频块和高频块对于“压缩能力-模型精度”的影响。


[Experiment Access Adress](#)


[1] Retrieve on 10th Aug 2019, "Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution", https://arxiv.org/pdf/1904.05049.pdfYunpeng ChenHaoqi FanBing XuZhicheng YanYannis KalantidisMarcus RohrbachShuicheng YanJiashi Feng

[2] Everson RM, Prashanth AK, Gabbay M, Knight BW, Sirovich L, Kaplan E. Representation of spatial frequency and orientation in the visual cortex. Proc Natl Acad Sci U S A. 1998;95(14):8334–8338. doi:10.1073/pnas.95.14.8334

[3] 

[4]

[5] Retrived on 15th Aug 2019, https://zh.wikipedia.org/wiki/Octave_(%E9%9B%BB%E5%AD%90%E5%AD%B8)

[6] Distinctive Images Features from Scale-Invariant Keypoints, David G. Lowe, https://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf, January 5, 2004

[7] https://zpascal.net/cvpr2018/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.pdf


 === 标签 ===

卷积神经网络,算子分析,认知科学,频谱分析,快速傅里叶变换


举报
分享

分享文章到朋友圈

分享文章到微博

倪平宇

发帖: 0粉丝: 2

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-14 09:06:49 沙发 显示全部楼层

拜读

点赞 回复 举报

AI小毛

发帖: 11粉丝: 18

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2019-8-14 09:18:42 板凳 显示全部楼层

膜拜!!!

点赞1 回复 举报

EI技术布道...

发帖: 1粉丝: 2

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-14 09:32:07 地板 显示全部楼层

赞,高质量干货文章!

评论
Yiakwy 昨天 11:20 评论

已经更新了,欢迎分析 

... 查看全部
点赞 回复 举报

ModelArts-...

发帖: 26粉丝: 4

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2019-8-14 09:32:45 5# 显示全部楼层

膜拜大神,火钳刘明

点赞 回复 举报

HCAI

发帖: 0粉丝: 1

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-14 10:00:30 6# 显示全部楼层

纯纯的干货

点赞 回复 举报

Joey啊

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-14 10:07:22 7# 显示全部楼层

点赞 感谢分享

点赞 回复 举报

StinkyTofu

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-14 10:40:31 8# 显示全部楼层

满满的干货,拜读!!!

点赞 回复 举报

白衣书生

发帖: 2粉丝: 1

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-14 11:23:33 9# 显示全部楼层

干货满满

点赞 回复 举报

游客

您需要登录后才可以回帖 登录 | 立即注册