摘要:目錄一引言二輕量化模型三網絡對比一引言自年以來,卷積神經網絡簡稱在圖像分類圖像分割目標檢測等領域獲得廣泛應用。創新點利用和這兩個操作來設計卷積神經網絡模型以減少模型使用的參數數量。
本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是:SqueezeNet、MobileNet、ShuffleNet、Xception。
目錄
一、引言?
二、輕量化模型?
? ? 2.1 SqueezeNet
? ? 2.2 MobileNet
? ? 2.3 ShuffleNet
? ? 2.4 Xception
三、網絡對比?
一、引言
自 2012 年 AlexNet 以來,卷積神經網絡(簡稱 CNN)在圖像分類、圖像分割、目標檢測等領域獲得廣泛應用。隨著性能要求越來越高,AlexNet 已經無法滿足大家的需求,于是乎各路大牛紛紛提出性能更優越的 CNN 網絡,如 VGG、GoogLeNet、ResNet、DenseNet 等。由于神經網絡的性質,為了獲得更好的性能,網絡層數不斷增加,從 7 層 AlexNet 到 16 層 VGG,再從 16 層 VGG 到 GoogLeNet 的 22 層,再到 152 層 ResNet,更有上千層的 ResNet 和 DenseNet。雖然網絡性能得到了提高,但隨之而來的就是效率問題。
?
效率問題主要是模型的存儲問題和模型進行預測的速度問題(以下簡稱速度問題)
第一,存儲問題。數百層網絡有著大量的權值參數,保存大量權值參數對設備的內存要求很高;
第二,速度問題。在實際應用中,往往是毫秒級別,為了達到實際應用標準,要么提高處理器性能(看英特爾的提高速度就知道了,這點暫時不指望),要么就減少計算量。
?
只有解決 CNN 效率問題,才能讓 CNN 走出實驗室,更廣泛的應用于移動端。對于效率問題,通常的方法是進行模型壓縮(Model Compression),即在已經訓練好的模型上進行壓縮,使得網絡攜帶更少的網絡參數,從而解決內存問題,同時可以解決速度問題。
相比于在已經訓練好的模型上進行處理,輕量化模型模型設計則是另辟蹊徑。輕量化模型設計主要思想在于設計更高效的「網絡計算方式」(主要針對卷積方式),從而使網絡參數減少的同時,不損失網絡性能。
?
本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是:SqueezeNet、MobileNet、ShuffleNet、Xception。
(PS: 以上四種均不是模型壓縮方法!!)
?
以下是四個模型的作者團隊及發表時間
其中 ShuffleNet 論文中引用了 SqueezeNet;Xception 論文中引用了 MobileNet
二、輕量化模型
由于這四種輕量化模型僅是在卷積方式上做了改變,因此本文僅對輕量化模型的創新點進行詳細描述,對實驗以及實現的細節感興趣的朋友,請到論文中詳細閱讀。
2.1 SqueezeNet
SqueezeNet 由伯克利&斯坦福的研究人員合作發表于 ICLR-2017,論文標題:
《SqueezeNet:AlexNet-level accuracy with 50x fewer parameters and <0.5MB》
?
命名:
從名字——SqueezeNet 就知道,本文的新意是 squeeze,squeeze 在 SqueezeNet 中表示一個 squeeze 層,該層采用 1*1 卷積核對上一層 feature map 進行卷積,主要目的是減少 feature map 的維數(維數即通道數,就是一個立方體的 feature map,切成一片一片的,一共有幾片)。
創新點:
1. 采用不同于傳統的卷積方式,提出 fire module;fire module 包含兩部分:squeeze 層+expand 層
創新點與 inception 系列的思想非常接近!首先 squeeze 層,就是 1*1 卷積,其卷積核數要少于上一層 feature map 數,這個操作從 inception 系列開始就有了,并美其名曰壓縮,個人覺得「壓縮」更為妥當。
Expand 層分別用 1*1 和 3*3 卷積,然后 concat,這個操作在 inception 系列里面也有。
SqueezeNet 的核心在于 Fire module,Fire module 由兩層構成,分別是 squeeze 層+expand 層,如下圖 1 所示,squeeze 層是一個 1*1 卷積核的卷積層,expand 層是 1*1 和 3*3 卷積核的卷積層,expand 層中,把 1*1 和 3*3 得到的 feature map 進行 concat。
具體操作情況如下圖所示:
Fire module 輸入的 feature map 為 H*W*M 的,輸出的 feature map 為 H*M*(e1+e3),可以看到 feature map 的分辨率是不變的,變的僅是維數,也就是通道數,這一點和 VGG 的思想一致。
首先,H*W*M 的 feature map 經過 Squeeze 層,得到 S1 個 feature map,這里的 S1 均是小于 M 的,以達到「壓縮」的目的,詳細思想可參考 Google 的 Inception 系列。
?
其次,H*W*S1 的特征圖輸入到 Expand 層,分別經過 1*1 卷積層和 3*3 卷積層進行卷積,再將結果進行 concat,得到 Fire module 的輸出,為 H*M*(e1+e3) 的 feature map。
?
fire 模塊有三個可調參數:S1,e1,e3,分別代表卷積核的個數,同時也表示對應輸出 feature map 的維數,在文中提出的 SqueezeNet 結構中,e1=e3=4s1。
?
講完 SqueezeNet 的核心——Fire module,看看 SqueezeNet 的網絡結構,如下圖所示:
?
網絡結構設計思想,同樣與 VGG 的類似,堆疊的使用卷積操作,只不過這里堆疊的使用本文提出的 Fire module(圖中用紅框部分)
看看 Squezeenet 的參數數量以及性能:
在這里可以看到,論文題目中提到的小于 0.5M,是采用了 Deep Compression 進行模型壓縮之后的結果!!
?
看了上圖再回頭看一看論文題目:?
SqueezeNet :AlexNet-level accuracy with 50x fewer parameters and <0.5MB
標!題!黨!SqueezeNet < 0.5MB, 這個是用了別的模型壓縮技術獲得的,很容易讓人誤以為 SqueezeNet 可以壓縮模型!!
?
SqueezeNet 小結:
1 Fire module 與 GoogLeNet 思想類似,采用 1*1 卷積對 feature map 的維數進行「壓縮」,從而達到減少權值參數的目的;
2 采用與 VGG 類似的思想——堆疊的使用卷積,這里堆疊的使用 Fire module
?
SqueezeNet 與 GoogLeNet 和 VGG 的關系很大!
2.2 MobileNet
MobileNet 由 Google 團隊提出,發表于 CVPR-2017,論文標題:
《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
?
命名:
MobileNet 的命名是從它的應用場景考慮的,顧名思義就是能夠在移動端使用的網絡模型。
?
創新點:
1. 采用名為 depth-wise separable convolution 的卷積方式代替傳統卷積方式,以達到減少網絡權值參數的目的。
?
通過采用 depth-wise convolution 的卷積方式,達到:1. 減少參數數量 2. 提升運算速度。(這兩點是要區別開的,參數少的不一定運算速度快!還要看計算方式!)
?
depth-wise convolution 不是 MobileNet 提出來的,也是借鑒,文中給的參考文獻是 2014 年的博士論文——《L. Sifre. Rigid-motion scattering for image classification. hD thesis, Ph. D. thesis, 2014》
?
depth-wise convolution 和 group convolution 是類似的,depth-wise convolution 是一個卷積核負責一部分 feature map,每個 feature map 只被一個卷積核卷積;group convolution 是一組卷積核負責一組 feature map,每組 feature map 只被一組卷積核卷積。Depth-wise convolution 可以看成是特殊的 group convolution,即每一個通道是一組。
MobileNets 精華在于卷積方式——depth-wise separable convolution;采用 depth-wise separable convolution,會涉及兩個超參:Width Multiplier 和 Resolution Multiplier 這兩個超參只是方便于設置要網絡要設計為多小,方便于量化模型大小。
?
MobileNet 將標準卷積分成兩步:
第一步 Depth-wise convolution, 即逐通道的卷積,一個卷積核負責一個通道,一個通道只被一個卷積核「濾波」;
第二步,Pointwise convolution,將 depth-wise convolution 得到的 feature map 再「串」起來,注意這個「串」是很重要的。「串」作何解?為什么還需要 pointwise convolution?作者說:However it only filters input channels, it does not combine them to create new features. Soan additional layer that computes a linear combination ofthe output of depth-wise convolution via 1 × 1 convolutionis needed in order to generate these new features。
?
從另外一個角度考慮,其實就是:輸出的每一個 feature map 要包含輸入層所有 feature map 的信息。然而僅采用 depth-wise convolution,是沒辦法做到這點,因此需要 pointwise convolution 的輔助。
?
「輸出的每一個 feature map 要包含輸入層所有 feature map 的信息」這個是所有采用 depth-wise convolution 操作的網絡都要去解決的問題,ShuffleNet 中的命名就和這個有關!詳細請看 2.3
?
Standard convolution、depth-wise convolution 和 pointwise convolution 示意圖如下:
?
?
其中輸入的 feature map 有 M 個,輸出的 feature map 有 N 個。
對 Standard convolution 而言,是采用 N 個大小為 DK*DK 的卷積核進行操作(注意卷積核大小是 DK*DK, DK*DK*M 是具體運算時一個卷積核的大小!)
?
而 depth-wise convolution + pointwise convolution 需要的卷積核呢?
?
Depth-wise convolution :一個卷積核負責一個通道,一個通道只被一個卷積核卷積;則這里有 M 個 DK*DK 的卷積核;?
?
Pointwise convolution:為了達到輸出 N 個 feature map 的操作,所以采用 N 個 1*1 的卷積核進行卷積,這里的卷積方式和傳統的卷積方式是一樣的,只不過采用了 1*1 的卷積核;其目的就是讓新的每一個 feature map 包含有上一層各個 feature map 的信息!在此理解為將 depth-wise convolution 的輸出進行「串」起來。
下面舉例講解 Standard convolution、depth-wise convolution 和 pointwise convolution。
假設輸入的 feature map 是兩個 5*5 的,即 5*5*2;輸出 feature map 數量為 3,大小是 3*3(因為這里采用 3*3 卷積核)即 3*3*3。
?
標準卷積是將一個卷積核(3*3)復制 M 份(M=2), 讓二維的卷積核(面包片)拓展到與輸入 feature map 一樣的面包塊形狀。
Standard 過程如下圖,X 表示卷積,+表示對應像素點相加,可以看到對于 O1 來說,其與輸入的每一個 feature map 都「發生關系」,包含輸入的各個 feature map 的信息。
?
Depth-wise 過程如下圖,可以看到 depth-wise convolution 得出的兩個 feature map——fd1 和 fd2 分別只與 i1 和 i2「發生關系」,這就導致違背上面所承認的觀點「輸出的每一個 feature map 要包含輸入層所有 feature map 的信息」,因而要引入 pointwise convolution。
?
那么計算量減少了多少呢?通過如下公式計算:?
?
其中 DK 為標準卷積核大小,M 是輸入 feature map 通道數,DF 為輸入 feature map 大小,N 是輸出 feature map 大小。本例中,DK=3,M=2,DF=5,N=3,參數的減少量主要就與卷積核大小 DK 有關。在本文 MobileNet 的卷積核采用 DK=3,則大約減少了 8~9 倍計算量。
?
看看 MobileNet 的網絡結構,MobileNet 共 28 層,可以發現這里下采樣的方式沒有采用池化層,而是利用 depth-wise convolution 的時候將步長設置為 2,達到下采樣的目的。
?
1.0 MobileNet-224 與 GoogLeNet 及 VGG-16 的對比:
?
可以發現,相較于 GoogLeNet,雖然參數差不多,都是一個量級的,但是在運算量上卻小于 GoogLeNet 一個量級,這就得益于 depth-wise convolution!
?
MobileNet 小結:
1. 核心思想是采用 depth-wise convolution 操作,在相同的權值參數數量的情況下,相較于 standard convolution 操作,可以減少數倍的計算量,從而達到提升網絡運算速度的目的。
2. depth-wise convolution 的思想非首創,借鑒于 2014 年一篇博士論文:《L. Sifre. Rigid-motion scattering for image classification. hD thesis, Ph. D. thesis, 2014》
3. 采用 depth-wise convolution 會有一個問題,就是導致「信息流通不暢」,即輸出的 feature map 僅包含輸入的 feature map 的一部分,在這里,MobileNet 采用了 point-wise convolution 解決這個問題。在后來,ShuffleNet 采用同樣的思想對網絡進行改進,只不過把 point-wise convolution 換成了 channel shuffle,然后給網絡美其名曰 ShuffleNet,欲知后事如何,請看 2.3 ShuffleNet
2.3 ShuffleNet
ShuffleNet 是 Face++團隊提出的,與 MobileNet 一樣,發表于 CVPR-2017,但晚于 MobileNet 兩個月才在 arXiv 上公開。論文標題:
《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》
?
命名:
一看名字 ShuffleNet,就知道 shuffle 是本文的重點,那么 shuffle 是什么?為什么要進行 shuffle?
?
shuffle 具體來說是 channel shuffle,是將各部分的 feature map 的 channel 進行有序的打亂,構成新的 feature map,以解決 group convolution 帶來的「信息流通不暢」問題。(MobileNet 是用 point-wise convolution 解決的這個問題)
因此可知道 shuffle 不是什么網絡都需要用的,是有一個前提,就是采用了 group convolution,才有可能需要 shuffle!!為什么說是有可能呢?因為可以用 point-wise convolution 來解決這個問題。
?
創新點:
1. 利用 group convolution 和 channel shuffle 這兩個操作來設計卷積神經網絡模型, 以減少模型使用的參數數量。
?
其中 group convolutiosn 非原創,而 channel shuffle 是原創。channel shuffle 因 group convolution 而起,正如論文中 3.1 標題: . Channel Shuffle for Group Convolution;?
?
采用 group convolution 會導致信息流通不當,因此提出 channel shuffle,所以 channel shuffle 是有前提的,使用的話要注意!
?
對比一下 MobileNet,采用 shuffle 替換掉 1*1 卷積,這樣可以減少權值參數,而且是減少大量權值參數,因為在 MobileNet 中,1*1 卷積層有較多的卷積核,并且計算量巨大,MobileNet 每層的參數量和運算量如下圖所示:
?
ShuffleNet 的創新點在于利用了 group convolution 和 channel shuffle,那么有必要看看 group convolution 和 channel shuffle。
?
Group convolution?
Group convolution 自 Alexnet 就有,當時因為硬件限制而采用分組卷積;之后在 2016 年的 ResNeXt 中,表明采用 group convolution 可獲得高效的網絡;再有 Xception 和 MobileNet 均采用 depth-wise convolution, 這些都是最近出來的一系列輕量化網絡模型。depth-wise convolution 具體操作可見 2.2 MobileNet 里邊有簡介。
?
如下圖 (a) 所示, 為了提升模型效率,采用 group convolution,但會有一個副作用,即:「outputs from a certain channel are only derived from a small fraction of input channels.」
于是采用 channel shuffle 來改善各組間「信息流通不暢」問題,如下圖 (b) 所示。
具體方法為:把各組的 channel 平均分為 g(下圖 g=3)份,然后依次序的重新構成 feature map
Channel shuffle 的操作非常簡單,接下來看看 ShuffleNet,ShuffleNet 借鑒了 Resnet 的思想,從基本的 resnet 的 bottleneck unit 逐步演變得到 ShuffleNet 的 bottleneck unit,然后堆疊的使用 ShuffleNet bottleneck unit 獲得 ShuffleNet;
?
下圖展示了 ShuffleNet unit 的演化過程?
圖 (a):是一個帶有 depth-wise convolution 的 bottleneck unit;?
圖 (b):作者在 (a) 的基礎上進行變化,對 1*1 conv 換成 1*1 Gconv,并在第一個 1*1 Gconv 之后增加一個 channel shuffle 操作;?
圖 (c): 在旁路增加了 AVG pool,目的是為了減小 feature map 的分辨率;因為分辨率小了,于是乎最后不采用 Add,而是 concat,從而「彌補」了分辨率減小而帶來的信息損失。
文中提到兩次,對于小型網絡,多多使用通道,會比較好。
「this is critical for small networks, as tiny networks usually have an insufficient number of channels to process the information」
所以,以后若涉及小型網絡,可考慮如何提升通道使用效率
?
至于實驗比較,并沒有給出模型參數量的大小比較,而是采用了 Complexity (MFLOPs) 指標,在相同的 Complexity (MFLOPs) 下,比較 ShuffleNet 和各個網絡,還專門和 MobileNet 進行對比,由于 ShuffleNet 相較于 MobileNet 少了 1*1 卷積層,所以效率大大提高了嘛,貼個對比圖隨意感受一下好了
?
ShuffleNet 小結:
1. 與 MobileNet 一樣采用了 depth-wise convolution,但是針對 depth-wise convolution 帶來的副作用——「信息流通不暢」,ShuffleNet 采用了一個 channel shuffle 操作來解決。
2. 在網絡拓撲方面,ShuffleNet 采用的是 resnet 的思想,而 mobielnet 采用的是 VGG 的思想,2.1 SqueezeNet 也是采用 VGG 的堆疊思想
2.4 Xception
Xception 并不是真正意義上的輕量化模型,只是其借鑒 depth-wise convolution,而 depth-wise convolution 又是上述幾個輕量化模型的關鍵點,所以在此一并介紹,其思想非常值得借鑒。
?
Xception 是 Google 提出的,arXiv 的 V1 版本 于 2016 年 10 月公開。論文標題:
《Xception: Deep Learning with Depth-wise Separable Convolutions》
?
命名:
Xception 是基于 Inception-V3 的,而 X 表示 Extreme,為什么是 Extreme 呢?因為 Xception 做了一個加強的假設,這個假設就是:?
we make the following hypothesis: that the mapping of cross-channels correlations and spatial correlations in the feature maps of convolutional neural networks can be entirely decoupled
?
創新點:
1. 借鑒(非采用)depth-wise convolution 改進 Inception V3
?
既然是改進了 Inception v3,那就得提一提關于 inception 的一下假設(思想)了。
「the fundamental hypothesis behind Inception is that cross-channel correlations and spatial correlations are sufficiently decoupled that it is preferable not to map them jointly」
簡單理解就是說,卷積的時候要將通道的卷積與空間的卷積進行分離,這樣會比較好。(沒有理論證明,只有實驗證明,就當它是定理,接受就好了,現在大多數神經網絡的論文都這樣。
既然是在 Inception V3 上進行改進的,那么 Xception 是如何一步一步的從 Inception V3 演變而來。
?
下圖 1 是 Inception module,圖 2 是作者簡化了的 inception module(就是只保留 1*1 的那條「路」,如果帶著 avg pool,后面怎么進一步假設嘛~)?
假設出一個簡化版 inception module 之后,再進一步假設,把第一部分的 3 個 1*1 卷積核統一起來,變成一個 1*1 的,后面的 3 個 3*3 的分別「負責」一部分通道,如圖 3 所示; 最后提出「extreme」version of an Inception,module Xception 登場,,先用 1*1 卷積核對各通道之間(cross-channel)進行卷積,如圖 4 所示,
?
?
作者說了,這種卷積方式和 depth-wise convolution 幾乎一樣。Depth-wise convolution 較早用于網絡設計是來自:Rigid-Motion Scatteringfor Image Classification,但是具體是哪一年提出,不得而知;至少 2012 年就有相關研究,再比如說 AlexNet,由于內存原因,AlexNet 分成兩組卷積 ;想深入了解 Depth-wise convolution 的可以查閱本論文 2.Prior work,里面有詳細介紹。
?
Xception 是借鑒 Rigid-Motion Scatteringfor Image Classification 的 Depth-wise convolution,是因為 Xception 與原版的 Depth-wise convolution 有兩個不同之處?
第一個:原版 Depth-wise convolution,先逐通道卷積,再 1*1 卷積; 而 Xception 是反過來,先 1*1 卷積,再逐通道卷積;?
第二個:原版 Depth-wise convolution 的兩個卷積之間是不帶激活函數的,而 Xception 在經過 1*1 卷積之后會帶上一個 Relu 的非線性激活函數;
?
Xception 結構如上圖所示,共計 36 層分為 Entry flow;Middle flow;Exit flow。。
Entry flow 包含 8 個 conv;Middle flow 包含 3*8 =24 個 conv;Exit flow 包含 4 個 conv,所以 Xception 共計 36 層。
?
文中 Xception 實驗部分是非常詳細的,實現細節可參見論文。
?
Xception 小結:
Xception 是基于 Inception-V3,并結合了 depth-wise convolution,這樣做的好處是提高網絡效率,以及在同等參數量的情況下,在大規模數據集上,效果要優于 Inception-V3。這也提供了另外一種「輕量化」的思路:在硬件資源給定的情況下,盡可能的增加網絡效率和性能,也可以理解為充分利用硬件資源。
三、網絡對比
本文簡單介紹了四個輕量化網絡模型,分別是 SqueezeNet、 MobileNet、 ShuffleNet 和 Xception,前三個是真正意義上的輕量化網絡,而 Xception 是為提升網絡效率,在同等參數數量條件下獲得更高的性能。
?
在此列出表格,對比四種網絡是如何達到網絡輕量化的。
實現輕量化技巧
這么一看就發現,輕量化主要得益于 depth-wise convolution,因此大家可以考慮采用 depth-wise convolution 來設計自己的輕量化網絡,但是要注意「信息流通不暢問題」。
解決「信息流通不暢」的問題,MobileNet 采用了 point-wise convolution,ShuffleNet 采用的是 channel shuffle。MobileNet 相較于 ShuffleNet 使用了更多的卷積,計算量和參數量上是劣勢,但是增加了非線性層數,理論上特征更抽象,更高級了;ShuffleNet 則省去 point-wise convolution,采用 channel shuffle,簡單明了,省去卷積步驟,減少了參數量。
?
學習了幾個輕量化網絡的設計思想,可以看到,并沒有突破性的進展,都是借鑒或直接使用前幾年的研究成果。希望廣大研究人員可以設計出更實在的輕量化網絡。
?
通過這幾篇論文的創新點,得出以下可認為是發 (Shui) 論文的 idea:
1. 采用 depth-wise convolution,再設計一個方法解決「信息流通不暢」問題,然后冠以美名 XX-Net。(看看 ShuffleNet 就是)
2. 針對 depth-wise convolution 作文章,卷積方式不是千奇百怪么?各種卷積方式可參考 Github(https://github.com/vdumoulin/conv_arithmetic),挑一個或者幾個,結合起來,只要參數量少,實驗效果好,就可以發 (Shui) 論文。
3. 接著第 2,如果設計出來一個新的卷積方式,如果也存在一些「副作用」,再想一個方法解決這個副作用,再美其名曰 XX-Net。就是自己「挖」個坑,自己再填上去。
個人介紹: 余霆嵩,廣東工業大學研三學生,研究方向:深度學習,目標檢測,圖像分類,模型壓縮
商業智能與數據分析群
興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識
QQ群:81035754
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4723.html
摘要:深度神經網絡已經成為解決計算機視覺語音識別和自然語言處理等機器學習任務的較先進的技術。圖深度壓縮的實驗結果訓練深度神經網絡可以被大量剪枝和壓縮的事實意味著我們當前的訓練方法具有一些局限性。 深度神經網絡已經成為解決計算機視覺、語音識別和自然語言處理等機器學習任務的較先進的技術。盡管如此,深度學習算法是計算密集型和存儲密集型的,這使得它難以被部署到只有有限硬件資源的嵌入式系統上。為了解決這個限...
摘要:本文介紹支付寶中的深度學習引擎。因而無論在運行速度和內存占用等性能指標還是在兼容性上,支付寶的移動端都必須做到極致,才能較大幅度地降低使用門檻。五大目標支付寶是針對國民環境定制開發的移動端解決方案,項目制定了如下技術目標。 本文介紹支付寶App中的深度學習引擎——xNN。xNN通過模型和計算框架兩個方面的優化,解決了深度學習在移動端落地的一系列問題。xNN的模型壓縮工具 (xqueeze) ...
摘要:前言阿里巴巴機器智能實驗室線下智能團隊從年底開始涉及線下智能領域,從算法工程產品化業務落地多個方面入手,與合作伙伴們一起取得了一些小小的成績。目前,該套工具作為推薦的量化工具廣泛應用在阿里集團內多個線下業務場景中。 showImg(https://segmentfault.com/img/remote/1460000019246850); 阿里妹導讀:AI 技術已經從互聯網走向零售、...
閱讀 4270·2021-09-26 10:11
閱讀 2666·2021-07-28 00:37
閱讀 3223·2019-08-29 15:29
閱讀 1178·2019-08-29 15:23
閱讀 3124·2019-08-26 18:37
閱讀 2468·2019-08-26 10:37
閱讀 597·2019-08-23 17:04
閱讀 2347·2019-08-23 13:44