間序列?)
振動(dòng)、動(dòng)作、電流和聲音都包含局部時(shí)間模式。相同沖擊或周期片段可能出現(xiàn)在窗口不同位置一維卷積使用同一組卷積核沿時(shí)間移動(dòng)能夠復(fù)用參數(shù)提取這些局部特征。深度可分離卷積進(jìn)一步把時(shí)間濾波與通道組合拆開(kāi)。在輸入輸出通道較多時(shí)它能夠顯著減少參數(shù)和MACC但真實(shí)速度仍取決于MCU優(yōu)化內(nèi)核。1D卷積沿時(shí)間共享權(quán)重深度可分離卷積先逐通道濾波再用1×1卷積混合通道。完成本篇后你應(yīng)該能夠解釋局部連接、參數(shù)共享、感受野和通道混合。計(jì)算普通Conv1D與深度可分離卷積的參數(shù)和MACC。構(gòu)建兩種Keras模型并核對(duì)資源差異與輸出shape。卷積核像一個(gè)短模板沿時(shí)間軸滑動(dòng)尋找局部模式。同一個(gè)模板在每個(gè)位置重復(fù)使用因此參數(shù)不隨窗口長(zhǎng)度增長(zhǎng)。圖1深度可分離卷積將時(shí)間濾波和通道混合拆成兩個(gè)階段一、局部連接與參數(shù)共享適合移動(dòng)模式長(zhǎng)度為5的卷積核每次只觀察相鄰5個(gè)時(shí)間點(diǎn)并在整個(gè)窗口重復(fù)使用。它能夠檢測(cè)局部斜率、尖峰或短周期片段而無(wú)需為每個(gè)時(shí)間位置設(shè)置獨(dú)立權(quán)重。卷積核數(shù)量決定輸出通道。前幾層通常學(xué)習(xí)基礎(chǔ)局部形狀后續(xù)層通過(guò)更大感受野組合成完整事件。二、感受野由核、步長(zhǎng)和層數(shù)共同決定卷積核太短可能看不到完整周期核太長(zhǎng)會(huì)增加計(jì)算并接近全連接。池化或步長(zhǎng)卷積能夠擴(kuò)大后續(xù)層的物理感受野也會(huì)降低時(shí)間分辨率。設(shè)計(jì)時(shí)應(yīng)把感受野換算成毫秒與事件持續(xù)時(shí)間比較。只看網(wǎng)絡(luò)層數(shù)無(wú)法判斷模型是否覆蓋了任務(wù)所需時(shí)間尺度。普通Conv1D參數(shù) ≈ K × Cin × Cout深度可分離參數(shù) ≈ K × Cin Cin × Cout三、深度可分離卷積減少通道乘法普通卷積同時(shí)完成時(shí)間濾波和通道組合。Depthwise階段為每個(gè)輸入通道使用獨(dú)立時(shí)間核Pointwise階段再使用1×1卷積組合通道參數(shù)量通常更低。減少理論MACC不保證同比加速。張量布局、量化重縮放、內(nèi)核實(shí)現(xiàn)和緩存訪問(wèn)都會(huì)影響實(shí)際時(shí)間應(yīng)在目標(biāo)運(yùn)行時(shí)上測(cè)量。表1三種結(jié)構(gòu)的資源特征結(jié)構(gòu)主要優(yōu)勢(shì)主要風(fēng)險(xiǎn)Dense簡(jiǎn)單、適合低維特征長(zhǎng)輸入?yún)?shù)多普通1D Conv局部模式與參數(shù)共享通道多時(shí)MACC增加深度可分離1D Conv參數(shù)與MACC更低依賴(lài)優(yōu)化內(nèi)核與數(shù)據(jù)布局四、激活內(nèi)存仍需要單獨(dú)控制輕量卷積減少權(quán)重并不會(huì)自動(dòng)縮小每層輸出。早期保持長(zhǎng)時(shí)間長(zhǎng)度并設(shè)置很多通道時(shí)中間激活仍可能成為Arena峰值。可以通過(guò)合理步長(zhǎng)、池化、通道數(shù)和全局平均池化控制激活。每次改結(jié)構(gòu)都同時(shí)檢查準(zhǔn)確率、最大張量和板端時(shí)間。Python/Keras原始六軸窗口的輕量1D卷積候選模型import tensorflow as tfinputs tf.keras.Input(shape(100, 6))x tf.keras.layers.Conv1D(16, 5, paddingsame, activationrelu)(inputs)x tf.keras.layers.MaxPooling1D(2)(x)x tf.keras.layers.SeparableConv1D(24, 5, paddingsame, activationrelu)(x)x tf.keras.layers.GlobalAveragePooling1D()(x)outputs tf.keras.layers.Dense(5, activationsoftmax)(x)model tf.keras.Model(inputs, outputs)感受野決定一個(gè)輸出能利用多長(zhǎng)上下文單層核寬5、步長(zhǎng)1的卷積一次看到5個(gè)相鄰點(diǎn)。堆疊兩層核寬5后第二層一個(gè)輸出能間接看到9個(gè)原始點(diǎn)。步長(zhǎng)和膨脹會(huì)更快擴(kuò)大感受野但同時(shí)降低時(shí)間分辨率或引入采樣間隔。感受野應(yīng)覆蓋任務(wù)局部結(jié)構(gòu)。100 Hz采樣下5點(diǎn)只有50 ms無(wú)法單獨(dú)描述1秒周期后續(xù)池化與多層卷積可以擴(kuò)大上下文。最終分類(lèi)前常使用全局平均池化把時(shí)間位置匯總成通道特征。padding影響邊界。valid會(huì)縮短序列same會(huì)補(bǔ)零保持長(zhǎng)度。窗口兩端的補(bǔ)零并非真實(shí)信號(hào)若事件常落在邊界模型可能受到影響。訓(xùn)練和部署必須使用模型聲明的同一padding。連續(xù)兩層stride1卷積的感受野R? 1 (K?-1) (K?-1)K?K?5時(shí)R?9個(gè)采樣點(diǎn)。深度可分離卷積把時(shí)間過(guò)濾與通道混合拆開(kāi)普通卷積的每個(gè)輸出通道同時(shí)連接所有輸入通道權(quán)重為K×Cin×Cout。深度卷積先為每個(gè)輸入通道獨(dú)立做時(shí)間過(guò)濾權(quán)重K×Cin1×1 pointwise卷積再混合通道權(quán)重Cin×Cout。Cin16、Cout32、K5時(shí)普通卷積權(quán)重2560深度可分離為80512592明顯減少。實(shí)際速度取決于目標(biāo)內(nèi)核是否高效支持這些算子較少M(fèi)ACC不保證同等比例加速。激活內(nèi)存仍可能很大。若深度卷積和pointwise之間保留長(zhǎng)序列中間張量Arena峰值不會(huì)按參數(shù)比例下降。結(jié)構(gòu)選擇要同時(shí)檢查權(quán)重、激活與內(nèi)核支持。普通與深度可分離卷積的計(jì)算對(duì)象階段權(quán)重?cái)?shù)量作用普通Conv1DK×Cin×Cout時(shí)間與通道聯(lián)合提取DepthwiseK×Cin每通道獨(dú)立時(shí)間過(guò)濾PointwiseCin×Cout通道線性組合動(dòng)手讓普通卷積與可分離卷積在同一輸入上對(duì)賬代碼構(gòu)建兩個(gè)輸入100×6、輸出類(lèi)別相同的網(wǎng)絡(luò)打印模型摘要、參數(shù)量與實(shí)際輸出shape。這里只比較結(jié)構(gòu)不聲稱(chēng)兩者準(zhǔn)確率相同。實(shí)驗(yàn)環(huán)境與輸入安裝TensorFlowpython -m pip install tensorflow。保存為 conv_compare.py 并運(yùn)行。無(wú)需訓(xùn)練數(shù)據(jù)使用全零張量驗(yàn)證shape。按順序完成實(shí)驗(yàn)運(yùn)行并記錄兩個(gè)模型參數(shù)。核對(duì)SeparableConv1D由depthwise與pointwise組成。把通道數(shù)24改為48比較參數(shù)增長(zhǎng)。加入stride2并觀察時(shí)間長(zhǎng)度與后續(xù)激活下降。可直接運(yùn)行兩個(gè)1D卷積候選模型的結(jié)構(gòu)比較import tensorflow as tfdef build(use_separable):inputs tf.keras.Input((100, 6))Layer tf.keras.layers.SeparableConv1D if use_separable else tf.keras.layers.Conv1Dx Layer(24, 5, strides1, paddingsame, activationrelu)(inputs)x tf.keras.layers.MaxPooling1D(2)(x)x Layer(32, 3, strides1, paddingsame, activationrelu)(x)x tf.keras.layers.GlobalAveragePooling1D()(x)outputs tf.keras.layers.Dense(5, activationsoftmax)(x)return tf.keras.Model(inputs, outputs)for name, flag in [(regular, False), (separable, True)]:model build(flag)y model(tf.zeros((1, 100, 6)))print(\n, name, params, model.count_params(), output, y.shape)for layer in model.layers:print(layer.name, layer.output.shape, layer.count_params())先讀懂代碼中的關(guān)鍵路徑兩個(gè)模型保持輸入、池化與輸出一致只替換卷積類(lèi)型便于歸因參數(shù)差異。逐層打印output.shape和count_params可與手算公式對(duì)賬。全局平均池化把時(shí)間軸壓縮為通道向量避免大Flatten。全零張量只驗(yàn)證shape和執(zhí)行不用于評(píng)價(jià)識(shí)別效果。你應(yīng)該觀察到什么兩個(gè)模型輸出shape均為(1,5)。可分離卷積模型參數(shù)顯著少于普通卷積。池化后時(shí)間長(zhǎng)度從100降到50。成功標(biāo)準(zhǔn)你能手算每個(gè)卷積層參數(shù)并與摘要一致。模型使用的算子在目標(biāo)TFLM版本中有實(shí)現(xiàn)。比較報(bào)告同時(shí)包含Arena和目標(biāo)板延遲。失敗時(shí)從哪里查起卷積結(jié)構(gòu)部署問(wèn)題現(xiàn)象原因處理參數(shù)少但更慢可分離內(nèi)核效率較低在目標(biāo)MCU測(cè)量算子耗時(shí)輸出長(zhǎng)度不符padding/stride解釋錯(cuò)誤逐層打印shape短事件漏檢下采樣過(guò)早檢查感受野與時(shí)間分辨率結(jié)構(gòu)公式用于提出候選最終仍要在同一數(shù)據(jù)、同一量化和同一目標(biāo)板條件下比較。把實(shí)驗(yàn)遷移到真實(shí)MCU項(xiàng)目轉(zhuǎn)換后導(dǎo)出算子列表確認(rèn)SeparableConv1D實(shí)際分解成哪些TFLite算子并與TFLM Resolver和CMSIS-NN支持逐項(xiàng)核對(duì)。可分離卷積的參數(shù)優(yōu)勢(shì)需要目標(biāo)板計(jì)時(shí)兌現(xiàn)。若內(nèi)核效率低或張量搬運(yùn)占主導(dǎo)普通卷積可能更快。保留同輸入的逐模型實(shí)測(cè)。量化后再次查看每層shape和算子。訓(xùn)練圖中的激活、批歸一化或卷積可能在轉(zhuǎn)換時(shí)融合最終TFLite結(jié)構(gòu)才是Resolver、Arena和板端計(jì)時(shí)的依據(jù)。把結(jié)果再向前推進(jìn)一步計(jì)算K5、Cin24、Cout32的兩種卷積權(quán)重比。畫(huà)出你的網(wǎng)絡(luò)每層時(shí)間長(zhǎng)度和感受野。檢查每個(gè)算子是否有目標(biāo)平臺(tái)優(yōu)化內(nèi)核。收束1D卷積利用時(shí)間局部性和參數(shù)共享深度可分離卷積進(jìn)一步拆分時(shí)間與通道計(jì)算。權(quán)重、激活和板端內(nèi)核效率仍需同時(shí)驗(yàn)證。參考資料Arm CMSIS-NN 官方文檔TensorFlow Lite Micro 官方代碼倉(cāng)庫(kù)Google AI Edge構(gòu)建并轉(zhuǎn)換微控制器模型