tag 标签: 人工智能

相关帖子
相关博文
  • 2020-3-6 14:45
    663 次阅读|
    0 个评论
    米尔工业级NXP开发板试用活动(MYD-C8MMX) 不久前 米尔推出了新一代高性价比核心板之王 MYC-C8MMX核心板及开发板 获得众多客户热烈反馈 这一次 我们给各位带来福利 i.MX8M mini开发板免费申请试用!!! 数量有限,赶紧动手申请 活动流程和事项: 时间: 申请时间:2020年02月25日-2020年03月29日 评测时间:收货后一个月内 申请方式及注意事项 1:复制下方链接进入面包板网活动页面: https://mbb.eet-china.com/evaluating/product-31.html 打开浏览器立即申请,按步骤完成申请。 2:请确保您所填的联系方式准确无误,开发板将按照申请信息邮寄。如地址不准确或不够详细,将不予发货! 3:快递费由深圳市米尔电子有限公司支出 评测任务 1.收到开发板之日起,在一个月内,必须完成不少于两篇评测。 2.在面包板社区发帖上传您的评测作品(图文)。 3.评测报告请发表在面包板社区论坛。 评测作品标题,请按照如下格式: 【MYD-C8MMX物联网开发板】+自拟标题 活动提示 1.没有时间参与评测的请勿申请,收到板子未完成评测,我们有权收回板子且退还邮费自付同时将公布不诚信之行为,因此带来的不良后果均由本人自行承担。 2.申请人收货后30天内未完成评测报告,无权将评测产品出售或转赠给他人。如无法在收货后30天内提交两篇评测报告,请将评测产品退回我司(运费自理)。 3.评测完成后,米尔电子会评选出优秀作品,前两名免费获得本次活动开发板(无需退回),后三名需退还开发板给厂家(费用到付即可)。 更多关于产品介绍 官网: http://www.myir-tech.com/product/myc-c8mmx.htm MYC-C8MMX开发板应用: http://www.myir-tech.com/news_list.asp?id=1830 资料下载: http://www.myir-tech.com/download.asp?nid=92 淘宝购买地址: http://rrd.me/gfXMF 活动申请链接: https://mbb.eet-china.com/evaluating/product-31.html#introduce
  • 热度 2
    2020-1-16 11:50
    1446 次阅读|
    1 个评论
    深度残差网络(deep residual learning, ResNet)获得了2016年CVPR会议的最佳论文奖,截至目前,在谷歌学术上的引用次数已经达到了惊人的37185次。 深度残差收缩网络(deep residual shrinkage network)是深度残差网络的一种新颖的升级版本,其实是深度残差网络、注意力机制(参照Squeeze-and-Excitation Network,SENet)和软阈值化的深度集成。 在一定程度上,深度残差收缩网络的工作原理,可以理解为:通过注意力机制注意到不重要的特征,然后通过软阈值化将它们置为零;或者说,通过注意力机制注意到重要的特征,将它们保留下来,从而加强深度神经网络从含噪声信号中提取有用特征的能力。 1.为什么要提出深度残差收缩网络呢? 首先,在对样本进行分类的时候,样本中不可避免地会有一些噪声,就像高斯噪声、粉色噪声、拉普拉斯噪声等。更广义地讲,样本中很可能包含着与当前分类任务无关的信息,这些信息也可以理解为噪声。这些噪声可能会对分类效果产生不利的影响。(软阈值化是许多信号降噪算法中的一个关键步骤) 举例来说,在马路边聊天的时候,聊天的声音里就可能会混杂车辆的鸣笛声、车轮声等等。当对这些声音信号进行语音识别的时候,识别效果不可避免地会受到鸣笛声、车轮声的影响。从深度学习的角度来讲,这些鸣笛声、车轮声所对应的特征,就应该在深度神经网络内部被删除掉,以避免对语音识别的效果造成影响。 其次,即使是同一个样本集,各个样本的噪声量也往往是不同的。(这和注意力机制有相通之处;以一个图像样本集为例,各张图片中目标物体所在的位置可能是不同的;注意力机制可以针对每一张图片,注意到目标物体所在的位置) 例如,当训练猫狗分类器的时候,对于标签为“狗”的5张图像,第1张图像可能同时包含着狗和老鼠,第2张图像可能同时包含着狗和鹅,第3张图像可能同时包含着狗和鸡,第4张图像可能同时包含着狗和驴,第5张图像可能同时包含着狗和鸭子。我们在训练猫狗分类器的时候,就不可避免地会受到老鼠、鹅、鸡、驴和鸭子等无关物体的干扰,造成分类准确率下降。如果我们能够注意到这些无关的老鼠、鹅、鸡、驴和鸭子,将它们所对应的特征删除掉,就有可能提高猫狗分类器的准确率。 2.软阈值化是很多降噪算法的核心步骤 软阈值化,是很多信号降噪算法的核心步骤,将绝对值小于某个阈值的特征删除掉,将绝对值大于这个阈值的特征朝着零的方向进行收缩。它可以通过以下公式来实现: 软阈值化的输出对于输入的导数为 由上可知,软阈值化的导数要么是1,要么是0。这个性质是和ReLU激活函数是相同的。因此,软阈值化也能够减小深度学习算法遭遇梯度弥散和梯度爆炸的风险。 在软阈值化函数中,阈值的设置必须符合两个的条件: 第一,阈值是正数;第二,阈值不能大于输入信号的最大值,否则输出会全部为零。 同时,阈值最好还能符合第三个条件: 每个样本应该根据自身的噪声含量,有着自己独立的阈值。 这是因为,很多样本的噪声含量经常是不同的。例如经常会有这种情况,在同一个样本集里面,样本A所含噪声较少,样本B所含噪声较多。那么,如果是在降噪算法里进行软阈值化的时候,样本A就应该采用较大的阈值,样本B就应该采用较小的阈值。在深度神经网络中,虽然这些特征和阈值失去了明确的物理意义,但是基本的道理还是相通的。也就是说,每个样本应该根据自身的噪声含量,有着自己独立的阈值。 3.注意力机制 注意力机制在计算机视觉领域是比较容易理解的。动物的视觉系统可以快速扫描全部区域,发现目标物体,进而将注意力集中在目标物体上,以提取更多的细节,同时抑制无关信息。具体请参照注意力机制方面的文章。 Squeeze-and-Excitation Network(SENet)是一种较新的注意力机制下的深度学习方法。 在不同的样本中,不同的特征通道,在分类任务中的贡献大小,往往是不同的。SENet采用一个小型的子网络,获得一组权重,进而将这组权重与各个通道的特征分别相乘,以调整各个通道特征的大小。这个过程,就可以认为是在施加不同大小的注意力在各个特征通道上。 在这种方式下,每一个样本,都会有自己独立的一组权重。换言之,任意的两个样本,它们的权重,都是不一样的。在SENet中,获得权重的具体路径是,“全局池化→全连接层→ReLU函数→全连接层→Sigmoid函数”。 4.深度注意力机制下的软阈值化 深度残差收缩网络借鉴了上述SENet的子网络结构,以实现注意力机制下的软阈值化。通过蓝色框内的子网络,就可以学习得到一组阈值,对各个特征通道进行软阈值化。 在这个子网络中,首先对输入特征图的所有特征,求它们的绝对值。然后经过全局均值池化和平均,获得一个特征,记为A。在另一条路径中,全局均值池化之后的特征图,被输入到一个小型的全连接网络。这个全连接网络以Sigmoid函数作为最后一层,将输出归一化到0和1之间,获得一个系数,记为α。最终的阈值可以表示为α×A。因此,阈值就是,一个0和1之间的数字×特征图的绝对值的平均。 通过这种方式,保证了阈值为正,而且不会太大。 而且,不同的样本就有了不同的阈值。因此,在一定程度上,可以理解成一种特殊的注意力机制: 注意到与当前任务无关的特征,通过软阈值化,将它们置为零;或者说,注意到与当前任务有关的特征,将它们保留下来。 5.深度残差收缩网络或许有更广泛的通用性 深度残差收缩网络事实上是一种通用的数据分类方法。 这是因为很多分类任务中,样本中或多或少都会包含一些噪声,以及不相关的信息。这些噪声和不相关的信息,有可能会对分类的效果造成影响。例如说: 在图片分类的时候 ,如果图片同时包含着很多其他的物体,那么这些物体就可以被理解成“噪声”;深度残差收缩网络或许能够借助注意力机制,注意到这些“噪声”,然后借助软阈值化,将这些“噪声”所对应的特征置为零,就有可能提高图像分类的准确率。 在语音识别的时候 ,如果在声音较为嘈杂的环境里,比如在马路边、工厂车间里聊天的时候,深度残差收缩网络也许可以提高语音识别的准确率,或者给出了一种能够提高语音识别准确率的思路。 参考网址 深度残差收缩网络:(四)注意力机制下的阈值设置 https://www.cnblogs.com/yc-9527/p/11604082.html 【深度残差收缩网络论文翻译】 Deep Residual Shrinkage Networks for Fault Diagnosis https://www.jianshu.com/p/bcdc9d75a302 秒懂深度残差收缩网络 https://www.jianshu.com/p/90f1ef1b06bc 论文网址 M. Zhao, S. Zhong, X. Fu, et al., Deep residual shrinkage networks for fault diagnosis, IEEE Transactions on Industrial Informatics, DOI: 10.1109/TII.2019.2943898 https://ieeexplore.ieee.org/document/8850096
  • 热度 1
    2020-1-15 20:52
    1515 次阅读|
    1 个评论
    【残差网络升级】深度残差收缩网络
    深度残差网络(ResNet)是一种非常成功的深度学习模型,自2015年底在arXiv公布以来,在谷歌学术上的引用量已经达到了惊人的37185次。深度残差收缩网络是ResNet的一种新型改进,这篇文章将进行详细的介绍。 首先,深度残差网络的核心贡献在于,引入了恒等映射,也就是下图中的Identity shortcut。普通的卷积神经网络是没有跨层的恒等映射的。更具体地,下图中的(a)-(c)展示了三种残差模块(residual building unit, RBU),每个残差模块都包含了一个恒等映射。在图(a)中,输入特征图和输出特征图的尺寸是相同的。在图(b)和(c)中,输出特征图的尺寸是和输入特征图不同的。深度残差网络的整体结构如图(d)所示。我们可以发现,深度残差网络的主体部分,是由很多残差模块堆叠而成的。 通常情况下,样本中含有噪声,或者与标签无关的冗余信息,会导致深度学习算法的效果有所降低。那么怎么解决这个问题呢?深度残差收缩网络提供了一种思路。 深度残差收缩网络的主要工作之一,就是在残差模块中添加了软阈值化,作为非线性的变换。如下图(a)所示,软阈值化将绝对值小于某一阈值的特征,直接赋值为零。将其他的特征,朝着零的方向,进行一定程度的“收缩”。这也是深度残差收缩网络名称的由来。 在图(b)中,作者进一步分析了软阈值化函数的梯度特性:梯度值要么为0,要么为1。与ReLU激活函数类似,这一特性减小了深度学习在训练时遭遇“梯度消失”和“梯度爆炸”的风险。 另外,阈值的取值是要满足一些条件的。第一,阈值是正数。第二,阈值不能太大。假设输入特征的取值都在-1和1之间,如果阈值为10,那么输出就会全部是0。第三,每个样本都应该根据自己的噪声含量,确定自己的阈值。也就是说,样本之间,应该有不同的阈值设置。 在深度残差收缩网络的残差模块中,嵌入了一个子模块(类似Squeeze-and-Excitation Networks),用于自动地设置软阈值化函数所用到的阈值。在图(a)中,整个特征图共用一个阈值。在图(c)中,特征图的每个通道各有一个独立的阈值。同时,图(b)和图(d)展示了两种深度残差收缩网络(DRSN-CS和DRSN-CW)的整体结构。我们可以发现,它们的整体结构其实是一致的,唯一的区别在于残差模块的不同。 我们可以看到,在这种网络结构之下,所获得的阈值,不仅为正数,而且取值不会太大(不会让所有输出全部为0)。另外,每个样本的阈值都是根据自己的特征图所确定的,因此每个样本都会有它自己独特的一组阈值。从而满足了上述关于阈值的三个条件。 作者采集了齿轮箱在健康状态和7种故障状态下的振动信号,进行分类算法的验证。在这里,为了充分验证深度残差收缩网络对含噪信号的分类能力,作者在这些振动信号中分别添加了不同程度的高斯白噪声、拉普拉斯噪声和粉红噪声,并且与一般的卷积神经网络(ConvNet)和深度残差网络(ResNet)进行了对比。 下面是添加-5dB到5dB高斯白噪声时的分类准确率对比:(a)训练集上的准确率,(b)测试集上的准确率 然后是添加-5dB到5dB拉普拉斯噪声时的分类准确率对比:(a)训练集上的准确率,(b)测试集上的准确率 最后是添加-5dB到5dB粉红噪声时的分类准确率对比:(a)训练集上的准确率,(b)测试集上的准确率 将高层特征约简到二维空间进行可视化,可以得到如下图片:(a) ConvNet,(b) ResNet,(c) 第一种深度残差收缩网络(DRSN-CS),(d)第二种深度残差收缩网络(DRSN-CW)。我们可以看到,深度残差收缩网络能够更好地将各种健康状态分离开来。 将训练过程中训练集和测试集上的损失绘制出来,可以得到如下图片:(a) ConvNet,(b) ResNet,(c) 第一种深度残差收缩网络(DRSN-CS),(d)第二种深度残差收缩网络(DRSN-CW)。可以看到深度残差收缩网络的loss被优化得更低。 M. Zhao, S. Zhong, X. Fu, B. Tang, M. Pecht, Deep Residual Shrinkage Networks for Fault Diagnosis, IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898 https://ieeexplore.ieee.org/document/8850096
  • 热度 1
    2020-1-15 10:05
    1318 次阅读|
    2 个评论
    深度残差收缩网络的Keras图像识别
    从本质上讲,深度残差收缩网络属于卷积神经网络,是深度残差网络(deep residual network, ResNet)的一个变种。它的核心思想在于,在深度学习进行特征学习的过程中,剔除冗余信息是非常重要的;软阈值化是一种非常灵活的、删除冗余信息的方式。 1.深度残差网络 首先,在介绍深度残差收缩网络的时候,经常需要从深度残差网络开始讲起。下图展示了深度残差网络的基本模块,包括一些非线性层(残差路径)和一个跨层的恒等连接。恒等连接是深度残差网络的核心,是其优异性能的一个保障。 2.深度残差收缩网络 深度残差收缩网络,就是对深度残差网络的残差路径进行收缩的一种网络。这里的“收缩”指的就是软阈值化。 软阈值化是许多信号降噪方法的核心步骤,它是将接近于零(或者说绝对值低于某一阈值τ)的特征置为0,也就是将 区间内的特征置为0,让其他的、距0较远的特征也朝着0进行收缩。 如果和前一个卷积层的偏置b放在一起看的话,这个置为零的区间就变成了 。因为τ和b都是可以自动学习得到的参数,这个角度看的话,软阈值化其实是可以将任意区间的特征置为零,是一种更灵活的、删除某个取值范围特征的方式,也可以理解成一种更灵活的非线性映射。 从另一个方面来看,前面的两个卷积层、两个批标准化和两个激活函数,将冗余信息的特征,变换成接近于零的值;将有用的特征,变换成远离零的值。之后,通过自动学习得到一组阈值,利用软阈值化将冗余特征剔除掉,将有用特征保留下来。 通过堆叠一定数量的基本模块,可以构成完整的深度残差收缩网络,如下图所示: 3.图像识别及Keras编程 虽然深度残差收缩网络原先是应用于基于振动信号的故障诊断,但是深度残差收缩网络事实上是一种通用的特征学习方法,相信在很多任务(计算机视觉、语音、文本)中都可能有一定的用处。 下面是基于深度残差收缩网络的MNIST手写数字识别程序(程序很简单,仅供参考): #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Dec 28 23:24:05 2019 Implemented using TensorFlow 1.0.1 and Keras 2.2.1 M. Zhao, S. Zhong, X. Fu, et al., Deep Residual Shrinkage Networks for Fault Diagnosis, IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898 @author: me """ from __future__ import print_function import keras import numpy as np from keras.datasets import mnist from keras.layers import Dense, Conv2D, BatchNormalization, Activation from keras.layers import AveragePooling2D, Input, GlobalAveragePooling2D from keras.optimizers import Adam from keras.regularizers import l2 from keras import backend as K from keras.models import Model from keras.layers.core import Lambda K.set_learning_phase(1) # Input image dimensions img_rows, img_cols = 28, 28 # The data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape , 1, img_rows, img_cols) x_test = x_test.reshape(x_test.shape , 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape , img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape , img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) # Noised data x_train = x_train.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) x_test = x_test.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) print('x_train shape:', x_train.shape) print(x_train.shape , 'train samples') print(x_test.shape , 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) def abs_backend(inputs): return K.abs(inputs) def expand_dim_backend(inputs): return K.expand_dims(K.expand_dims(inputs,1),1) def sign_backend(inputs): return K.sign(inputs) def pad_backend(inputs, in_channels, out_channels): pad_dim = (out_channels - in_channels)//2 return K.spatial_3d_padding(inputs, padding = ((0,0),(0,0),(pad_dim,pad_dim))) # Residual Shrinakge Block def residual_shrinkage_block(incoming, nb_blocks, out_channels, downsample=False, downsample_strides=2): residual = incoming in_channels = incoming.get_shape().as_list() for i in range(nb_blocks): identity = residual if not downsample: downsample_strides = 1 residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, strides=(downsample_strides, downsample_strides), padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) # Calculate global means residual_abs = Lambda(abs_backend)(residual) abs_mean = GlobalAveragePooling2D()(residual_abs) # Calculate scaling coefficients scales = Dense(out_channels, activation=None, kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(abs_mean) scales = BatchNormalization()(scales) scales = Activation('relu')(scales) scales = Dense(out_channels, activation='sigmoid', kernel_regularizer=l2(1e-4))(scales) scales = Lambda(expand_dim_backend)(scales) # Calculate thresholds thres = keras.layers.multiply( ) # Soft thresholding sub = keras.layers.subtract( ) zeros = keras.layers.subtract( ) n_sub = keras.layers.maximum( ) residual = keras.layers.multiply( ) # Downsampling (it is important to use the pooL-size of (1, 1)) 1: identity = AveragePooling2D(pool_size=(1,1), strides=(2,2))(identity) # Zero_padding to match channels (it is important to use zero padding rather than 1by1 convolution) if in_channels != out_channels: identity = Lambda(pad_backend)(identity, in_channels, out_channels) residual = keras.layers.add( ) return residual # define and train a model inputs = Input(shape=input_shape) net = Conv2D(8, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(inputs) net = residual_shrinkage_block(net, 1, 8, downsample=True) net = BatchNormalization()(net) net = Activation('relu')(net) net = GlobalAveragePooling2D()(net) outputs = Dense(10, activation='softmax', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(net) model = Model(inputs=inputs, outputs=outputs) model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics= ) model.fit(x_train, y_train, batch_size=100, epochs=5, verbose=1, validation_data=(x_test, y_test)) # get results K.set_learning_phase(0) DRSN_train_score = model.evaluate(x_train, y_train, batch_size=100, verbose=0) print('Train loss:', DRSN_train_score ) print('Train accuracy:', DRSN_train_score ) DRSN_test_score = model.evaluate(x_test, y_test, batch_size=100, verbose=0) print('Test loss:', DRSN_test_score ) print('Test accuracy:', DRSN_test_score ) 为方便对比,深度残差网络的代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Dec 28 23:19:03 2019 Implemented using TensorFlow 1.0 and Keras 2.2.1 K. He, X. Zhang, S. Ren, J. Sun, Deep Residual Learning for Image Recognition, CVPR, 2016. @author: me """ from __future__ import print_function import numpy as np import keras from keras.datasets import mnist from keras.layers import Dense, Conv2D, BatchNormalization, Activation from keras.layers import AveragePooling2D, Input, GlobalAveragePooling2D from keras.optimizers import Adam from keras.regularizers import l2 from keras import backend as K from keras.models import Model from keras.layers.core import Lambda K.set_learning_phase(1) # input image dimensions img_rows, img_cols = 28, 28 # the data, split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape , 1, img_rows, img_cols) x_test = x_test.reshape(x_test.shape , 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape , img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape , img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) # Noised data x_train = x_train.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) x_test = x_test.astype('float32') / 255. + 0.5*np.random.random( , img_rows, img_cols, 1]) print('x_train shape:', x_train.shape) print(x_train.shape , 'train samples') print(x_test.shape , 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) def pad_backend(inputs, in_channels, out_channels): pad_dim = (out_channels - in_channels)//2 return K.spatial_3d_padding(inputs, padding = ((0,0),(0,0),(pad_dim,pad_dim))) def residual_block(incoming, nb_blocks, out_channels, downsample=False, downsample_strides=2): residual = incoming in_channels = incoming.get_shape().as_list() for i in range(nb_blocks): identity = residual if not downsample: downsample_strides = 1 residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, strides=(downsample_strides, downsample_strides), padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) residual = BatchNormalization()(residual) residual = Activation('relu')(residual) residual = Conv2D(out_channels, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(residual) # Downsampling (it is important to use the pooL-size of (1, 1)) 1: identity = AveragePooling2D(pool_size=(1, 1), strides=(2, 2))(identity) # Zero_padding to match channels (it is important to use zero padding rather than 1by1 convolution) if in_channels != out_channels: identity = Lambda(pad_backend)(identity, in_channels, out_channels) residual = keras.layers.add( ) return residual # define and train a model inputs = Input(shape=input_shape) net = Conv2D(8, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(inputs) net = residual_block(net, 1, 8, downsample=True) net = BatchNormalization()(net) net = Activation('relu')(net) net = GlobalAveragePooling2D()(net) outputs = Dense(10, activation='softmax', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(net) model = Model(inputs=inputs, outputs=outputs) model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics= ) model.fit(x_train, y_train, batch_size=100, epochs=5, verbose=1, validation_data=(x_test, y_test)) # get results K.set_learning_phase(0) resnet_train_score = model.evaluate(x_train, y_train, batch_size=100, verbose=0) print('Train loss:', resnet_train_score ) print('Train accuracy:', resnet_train_score ) resnet_test_score = model.evaluate(x_test, y_test, batch_size=100, verbose=0) print('Test loss:', resnet_test_score ) print('Test accuracy:', resnet_test_score ) 备注: (1)深度残差收缩网络的结构比普通的深度残差网络复杂,也许更难训练。 (2)程序里只设置了一个基本模块,在更复杂的数据集上,可适当增加。 (3)如果遇到这个TypeError:softmax() got an unexpected keyword argument 'axis',就点开tensorflow_backend.py,将return tf.nn.softmax(x, axis=axis)中的第一个axis改成dim即可。 参考文献: M. Zhao, S. Zhong, X. Fu, et al., Deep residual shrinkage networks for fault diagnosis, IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898 https://ieeexplore.ieee.org/document/8850096
  • 热度 6
    2019-12-18 20:27
    5330 次阅读|
    5 个评论
    AI芯片说自己性能比GPU好,GPU说自己性能比CPU好,这不是耍流氓吗?
    感觉这大半年参加芯片发布活动,观察一件很有意思的事:GPU 厂商说 AI 算力的时候,都喜欢拿自己跟 CPU 去比;AI 芯片厂商在说 AI 算力的时候,又很喜欢拿自己去跟 GPU 比。CPU 在 AI 时代成为了鄙视链最底层。看起来不仅绝对性能跑不过人家,而且能效比还差那么远。 好像只要参加 AI 芯片相关的会,一定会有人提 AlexNet 创世纪般的存在,也一定有人提 OpenAI 在 2018 年年中发布的《AI 与计算》分析报告 。因为里面说,从 2012 年至今,最大型的 AI training 计算量每 3.4 个月就会翻一倍——所以到 2018 年实际已经涨了超过 30 万倍。如果按照摩尔定律两年翻番来算,那么其实,2012-2018 年理论上芯片性能只能涨 7 倍。 看看,“只能”涨 7 倍,CPU 是应该哭一哭的——虽然实际上就摩尔定律,这里援引的数据都不准确,人家也不是说性能翻番不是?当然了,这些都不重要。重点在于,AI 算力需求这些年大幅攀升。 AI 芯片是某一类专用芯片 感觉这大半年我都在客观上探讨一件事,在刚进入 EE Times 不久,就看到 MIT 2018 年出的一篇 paper。这篇 paper 也在我这大半年写的文章里,被反复提及,题为《通用技术计算机的衰落:为何深度学习和摩尔定律的终结正致使计算碎片化》。在整体观点上,这篇 paper 其实还十分有趣。几个月前,我把这篇 paper 的观点做了浓缩和重构,再加了一些额外的料,构成了一篇《深度学习的兴起,是通用计算的挽歌?》 。 各位有兴趣可以去看一下,这篇文章真的细节动人、论据充分、观点鲜明、语句通顺......这里再总结一下,其实观点很简单,就是既然 CPU 现在性能涨幅这么小,工艺节点都难推进,那这条路差不多就快走完了;然鹅,还有专用计算这条路啊:就是针对不同的应用场景,咱们开发专门的芯片,量身定制、量体裁衣:这样的话就能做到性能持续大幅攀升,与此同时效率高、功耗还大幅降低。 其实论证这个观点的过程还是非常有趣的,比如说谷歌 TPU 出现了,就是专用芯片的最佳例证,它就真的只能做一件事。 这篇 paper 看起来美好而高级、优雅而低调。不过在随后工作的时间里,我基本上是在花全部的时间,尝试听取行业内的参与者们是否赞同这一点。很遗憾的是,几乎我听到的绝大部分声音,都在彻底否定这个论调。有关这一点,实际还可以从 1 月份即将发行的《观点》杂志,我的文章《AI芯片专用好还是通用好?遥想20年前GPU也面临这一抉择》中看到比较详细的论述。这里就不提太多了(下个月就和大家见面哟)。 绝对专用芯片也就是 ASIC,的确效率高、算力也高。但它实际受到两个巨大问题的影响: 第一是成本。 这是个看起来非常废话的原因。像 CPU 这种全银河系通用、只在大麦哲伦星系不通用的芯片,你在上面干什么不行啊?都可以,装个 Windows,然后跑个虚拟机,还能装 macOS,写文档、做设计、修图、剪视频、炒股票,各种软件都能跑,医疗、交通、政府、金融,咱都能干。甚至,如果你一定要跑 AI 任务,CPU 其实也可以干。 所以 CPU 的特点,就决定了,这一类产品是全局适用的。它的销量非常大,渗透在人类生活的方方面面。所以即便新制程的设计和工艺成本都在指数级攀升,造个工厂花几十亿美金才可以——未来还要更多。不过这么昂贵的制造成本,实际能够消受得起的产品类型就不多。到最具体的产品上,手机、PC 都是可以承担这个成本的,因为它们每年的销量特别大,单 iPhone一年就卖超过 2亿台...每个手机、PC 至少都需要 CPU 才能跑得起来。CPU 有充足的量来摊薄设计与制造成本(实际情况比这还要复杂一些,还是推荐各位去看 这篇文章)。 而专用芯片是完全不具备这种成本摊薄特性的:因为它只针对某一个领域。绝大部分特定领域都不具备走量来摊薄最先进制程工艺成本的能力。比如汽车,这是个看起来十分庞大的市场了,但全球销量最好的车型,年销量也不过区区两三百万——这个量对一个车型就一颗专用芯片的设计和制造成本而言,实在不是个划算的数字——采用最先进制程则几乎是没有可能的。 当然,汽车专用芯片仍然可以考虑用成本更低、更早的制程来造芯片(以及某一颗芯片用在大量车型上)——这也是现在绝大部分专用芯片的常规方案。不过当“专用”芯片所覆盖的市场容量本身就不大,以及可能比汽车市场还要小很多的时候,尤其是很多 B 端市场——天花板是明摆着的,又靠什么来抵消芯片设计与制造成本? 这个问题在 MIT 的那篇 paper 中实则有着非常翔实的论述,其中详细列出了关乎特定市场容量、专用芯片产量、专用芯片相较通用处理器的性能与效率优势有多大,这些变量相互之间是什么样的关系。在满足怎样的条件时,专用芯片可以提供更高的成本效益。 在我更早期撰写的采访文章中,针对 ASIC 制造耗费成本这件事,我们有一个更准确地认识,即《摩尔定律失效,FPGA 迎来黄金时代?》 。不过这篇采访文章实则忽视了一个重要事实,就是 MIT 提到的上述这几个变量关系。而且专用芯片其实没有必要采用最新的制程,依然可以在性能和能效上碾压通用芯片(或 FPGA)。我在《深度学习的兴起,是通用计算的挽歌?》文中同样浓缩了这部分理论,在文章的第三部分“专用处理器市场过小?”章节内——不过当时为了理解方便,我没有将 MIT 提到的所有变量都放到我的这篇文章中,所以仍然建议去看 MIT的原文。 第二是通用性差异。 双重标准:通用与性能 CPU 的通用属性就决定了,它在任何一个方面,其实都很难做到精通,或者说针对任何具体应用场景的算力和效率表现其实都一般。因为 CPU 需要耗费大量面积来做多层级 cache,微架构前端也很重要,真正的执行单元所占尺寸就那么点。因为 CPU 需要处理各种类型的工作,各种条件分支之类的东西。 但 CPU 的设计和工艺都是具备相当难度的,至少显著难于绝大部分专用芯片。用 GPU 去比 CPU 的 AI 算力,这种对比的价值显然是不大的。这其中的核心就在于,GPU 实际上本来就算是一种专用芯片。至少早年,GPU 就用于图形计算,它只做这一件事。而且实际在 GPU 诞生的更早期,它本来就以 ASIC 的面貌出现——它从骨子里是一种专用芯片。用 CPU 这样绝对通用的芯片,去比较 GPU 这种专用芯片,又有什么价值?尤其如果你还比较浮点运算能力,那就更奇特了。 不过 GPU 这个类型的芯片,在发展中后期发生了一些很显著的变化。它开始越来越具备通用属性(这个转变原因也可以从《观点》杂志中找),shader 核心这种非固定功能单元的地位越来越重要。即便 GPU 仍然没有 CPU 那么通用,但 cuda 编程这种东西是现如今人尽皆知的;GPU 的可编程性,或者叫灵活性变得越来越高。所以 GPU 现在早就不只用于图形计算了。 我们说将 GPU 应用于 AI 计算,不管是云端 training 还是终端 inferencing,其本质都是 GPU 通用属性的某一个方向;AI 计算在 GPGPU 世界里,不过是其中一个组成部分罢了。只不过是因为 AI 计算这个方向实在是潜力太大了,所以 GPU 厂商开始将 AI 计算作为一个着重发展的方向来对待,以及还针对 AI计算特别加入了一些专用单元,比如张量核心。 然鹅这个时候,AI 专用芯片华丽丽地出现了,比如谷歌的 TPU、比如特斯拉的 FSD(Full Self-Driving Computer),以及一众国内外的 AI 芯片新品。 AI 专用芯片如果专用、固化到 TPU 那样的程度,只针对卷积神经网络,采用 Systolic Array 技术;前述第一个成本问题之外,它具有的第二个局限性就在于几乎没有灵活性可言。尤其在 AI 算法每个月甚至每周都可能发生变化的情况下,芯片 18 个月开发周期,当芯片问世的时候,这颗芯片就极有可能已经落后了。 但我们仍然不得不承认,AI 芯片在它所擅长的任务上,可能具备在效能与算力上大幅领先 GPU 的能力。所以 AI 芯片厂商几乎清一色地会在发布会上宣布,自家产品可以吊打某 N 字头企业的 GPU 某明星产品。 这件事,本质上约等于拿 GPU 去和 CPU 比浮点运算能力。而且实际上,AI 芯片比较的“AI 算力”大部分情况下是低精度的,比如很多终端 inferencing 芯片 INT8 计算能力很强——那你怎么不比比双精度?因为你不能做双精度运算?这种对比是将 GPU放在通用计算的地位上,用专用计算的 AI 芯片——包括专门设计的 cache 或 HBM、低精度执行单元等——来吊打 GPU。这同样是件没有价值的事情。 不过更有意思的是,GPU 此刻为自己辩驳的方式,大部分是说:我能做的事情更多啊,比 TPU 之流的 AI 芯片能做的事情多太多了,它们那些 AI 芯片就只能做一件事。 这属于典型的双标,在和 CPU 比较时,宣称自己 AI 算力高出一大截;在和 AI 芯片比较时,宣称自己更通用。这不是双标吗? 是否存在第三类通用芯片? 其实我花了比较长的时间去理解,为什么 MIT 的这篇 paper 并不能成立;至少它成立的概率会很低。因为就历史经验来看,它是不对的:当我们参考 CPU 和 GPU 的兴衰史,其实就很容易发现,专用芯片在大部分历史条件下都不会成为主流,而只能成为某个历史时期的特定过渡产品。有关这一点仍然推荐去看 1 月份即将发布的《观点》杂志文章,这在前文已经提到了。 不过 AI 芯片是顺应时代潮流产生的一种芯片类型——除了前文提到的 TPU、FSD 这类相对极端的绝对专用 AI 芯片,当代越来越多的 AI 芯片都已经产生弱编程特性了,就跟当年的 GPU 一样。就连 Arm 的 NPU IP 实则都融入了一定的灵活性。也就是说,如今有一大批 AI 芯片实际是具备灵活性或通用性的,它们不只能做一件事,从结构上它还为未出现的算法做考量。 Graphcore IPU、华为昇腾都在其列。也就是说,AI 芯片在 AI 计算时,不仅效率相较 GPU 更出色,而且它还具备一定的通用性。这实则才是很多 AI 芯片企业在宣传中提到,在 CPU、GPU 之外,第三类芯片出现的原因,就是 AI 芯片。它可能将拥有自己的适用领域、迭代周期、开发生态。未来 CPU、GPU 和 AI 芯片就要成为三条并行的线了。 从应用场景来看,这个观念好像是成立的。至少我觉得,它比 MIT 说的专用芯片成为未来这一点要靠谱多了。 但我仍然觉得,这种畅想的实现概率也会比较低——至少在云端 AItraining 这部分市场,GPU 可能将长期占据垄断地位,且难以撼动。因为 GPU 不仅具备制程优势(有能力采用最先进制程的少数派),而且具备开发生态优势——大量开发者都愿意投入其中,因为它相比 AI 芯片,具备了先天的生态基础,且发展多年。GPU 开发生态优势巨大的程度在从上至下、上天入地、贯彻电子科技行业,GPU 是无处不在的。 当开始拼开发软件栈的时候,一场全新的厮杀战就要上演了。某种芯片进入可编程时代,经营这类芯片的公司就不只是一家芯片公司了,它对软件人力物力的投入极有可能大于硬件,以 1:10 的硬件、软件工程师比例存在于世。这个时候,企业和行业都会变得越来越庞大。在行业整体价值的复合年增长率无法满足企业的成本投入攀升时,市场会逐渐步入寡头时代。GPU 市场就是如此发展至今的。 某 N 字头企业在如今的 AI training 市场已经占据了绝对统领地位,这种地位的不可撼动性就体现在开发生态的绝对优势上。且其发展经验积累,又令其具备了充足的资本优势可持续完善这个闭环生态,从软件到硬件。这就不是哪家 AI 芯片厂商随便对比一下性能、能效足以完事儿的了。生态优势可以彻底无视性能、能效的那点差别,尤其当这种性能、能效差别并没有数量级差别时。 所以,很多 AI芯片初创企业畅想中的第三类芯片究竟能不能成立,或许要打一个问号。 好了,本文的 YY 差不多就到这里了。很多时候,历史经验是没有任何价值的,尤其我们说“具体问题具体分析”的时候,每一个事件的发展过程都有其特殊性,那些依据历史经验做推断的过程,本质上都是在胡说八道;在新事物面前,一切规律总结都只是在博君一笑——比如上面说的这么多东西。比如在终端小型 inferencing 现场,AI 芯片是能够长期发挥价值的,这仍然可以促成生态的持续反向完善。 不过至少,AI 芯片用自己的标准去和 GPU 比算力,GPU 又用自己的标准去和 CPU 比算力,同时还宣称自己比 AI 芯片能做更多的事,本质上都是耍流氓。 本文图片全部来自 unsplash,文章参考来源: AI and Compute(https://openai.com/blog/ai-and-compute/) 深度学习的兴起,是通用计算的挽歌?( https://www.eet-china.com/news/201907120931.html ) 摩尔定律失效,FPGA迎来黄金时代?( https://www.eet-china.com/news/201909191453.html )
相关资源
广告