做深度學(xué)習(xí)這么久了蔼两,好像還沒有隨筆記過很多東西甩鳄,隨著年齡的增長,沒辦法额划,記憶力越來越不行了妙啃,只能隨筆筆記一下一下了,也順便把實(shí)際的經(jīng)驗(yàn)分享出去俊戳,幫助到更多的人撒揖赴,當(dāng)然了,我也希望有人跟我一起探討....
今天分享什么呢抑胎?算了燥滑,一個小問題把,關(guān)于深學(xué)框架keras網(wǎng)絡(luò)層的一個應(yīng)用阿逃,好了好了铭拧,不廢話了..
我們在做一些圖像分割的時候赃蛛,可能會需要把圖像的不同的通道分別處理,這時候就需要把網(wǎng)絡(luò)層中的某些通道進(jìn)行拆分搀菩,但是keras并沒有提供類似`tf.split`這樣的方法呕臂,反而我們只能看到一個`keras.layers.merge`這樣一個合并層,那么我們怎樣使用keras進(jìn)行拆分呢肪跋?很簡單歧蒋,借助`keras.layers.core.Lambda`實(shí)現(xiàn)
keras在層中間其實(shí)都是張量進(jìn)行傳遞,那么張量是可以像數(shù)組一樣進(jìn)行切片的州既,知道這一點(diǎn)就好操作了谜洽,不好意思,又扯了一大堆廢話吴叶,直接上代碼比較實(shí)在
下面以Unet分割網(wǎng)絡(luò)舉例褥琐,通過Unet預(yù)測圖像的mask區(qū)域以及圖像類別,比如晤郑,我們的實(shí)際情景是:先預(yù)測mask區(qū)域,然后再預(yù)測mask區(qū)域的類別贸宏,這時候我們可以通過Unet一步到位造寝,而不用處理2個模型,具體步驟如下:
1.定義數(shù)據(jù)的label.這里的label不像做圖像分類的時候那樣吭练,單純的定義一個0或者1,然后轉(zhuǎn)換為one-hot編碼诫龙,因?yàn)閁net是每個像素級別的分類,所以我們需要為每個像素都定義一個label,換句話說鲫咽,mask區(qū)域有多大签赃,label就有多大,所以第一步是定義一個和mask原圖一樣大的label數(shù)組
2.得到mask區(qū)域的label.把mask數(shù)組* label數(shù)組即可(前提是mask必須是0或1的二值圖)
3.把1和2得到的兩個數(shù)組填充在一個數(shù)組里面,返回作為神經(jīng)網(wǎng)絡(luò)訓(xùn)練的標(biāo)簽
4. 修改Unet網(wǎng)絡(luò)結(jié)構(gòu)
代碼如下:??
mask_label = np.zeros((self.target_size[0], self.target_size[1], 2))
new_label = np.multiply(mask, mask_label[:, :, 1])? ?# 求mask區(qū)域的label
mask_label[:, :, 0] = mask # 第0通道表示mask區(qū)域
mask_label[:, :, 1] = new_label? # 第1通道表示mask區(qū)域的label? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Unet網(wǎng)絡(luò)修改如下:
def slices(x, index):?
? ? ? return x[:, :, :, index:index+1]
...
de_out = Conv2D(filters=target_channels, kernel_size=(3, 3), padding='same', strides=(1, 1))(de_8)? # 這層是Unet的倒數(shù)第二層分尸,其它層根據(jù)自己實(shí)際情況構(gòu)建把
x1 = keras.layers.core.Lambda(slices, arguments={"index": 0}, name="mask")(de_out)? # 拆分網(wǎng)絡(luò)層得到第0通道
x2 = keras.layers.core.Lambda(slices, arguments={"index": 1})(de_out)? # 拆分網(wǎng)絡(luò)層得到第1通道
conv10 = keras.layers.multiply([x1, x2], name="mask_label")? ? # 拆分的2個通道乘積
conv11 = keras.layers.concatenate([x1, conv10])? ? # 合并通道為一個輸出
model = Model(input=[input_layer], output=conv11)
修改完網(wǎng)絡(luò)層以后锦聊,接下來干嘛呢,當(dāng)然是訓(xùn)練神經(jīng)網(wǎng)絡(luò)了..
所有的步驟就是醬紫啦箩绍,好像寫的有些啰嗦孔庭,代碼沒有高亮,見諒啊材蛛,下次用MarkDown語法改正圆到,我肯定改正哦...233333