最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Keras實(shí)現(xiàn)DenseNet結(jié)構(gòu)操作

 更新時(shí)間:2020年07月06日 14:43:32   作者:小石學(xué)CS  
這篇文章主要介紹了Keras實(shí)現(xiàn)DenseNet結(jié)構(gòu)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

DenseNet結(jié)構(gòu)在16年由Huang Gao和Liu Zhuang等人提出,并且在CVRP2017中被評為最佳論文。網(wǎng)絡(luò)的核心結(jié)構(gòu)為如下所示的Dense塊,在每一個(gè)Dense塊中,存在多個(gè)Dense層,即下圖所示的H1~H4。各Dense層之間彼此均相互連接,即H1的輸入為x0,輸出為x1,H2的輸入即為[x0, x1],輸出為x2,依次類推。最終Dense塊的輸出即為[x0, x1, x2, x3, x4]。這種結(jié)構(gòu)個(gè)人感覺非常類似生物學(xué)里邊的神經(jīng)元連接方式,應(yīng)該能夠比較有效的提高了網(wǎng)絡(luò)中特征信息的利用效率。

DenseNet的其他結(jié)構(gòu)就非常類似一般的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)了,可以參考論文中提供的網(wǎng)路結(jié)構(gòu)圖(下圖)。但是個(gè)人感覺,DenseNet的這種結(jié)構(gòu)應(yīng)該是存在進(jìn)一步的優(yōu)化方法的,比如可能不一定需要在Dense塊中對每一個(gè)Dense層均直接進(jìn)行相互連接,來縮小網(wǎng)絡(luò)的結(jié)構(gòu);也可能可以在不相鄰的Dense塊之間通過簡單的下采樣操作進(jìn)行連接,進(jìn)一步提升網(wǎng)絡(luò)對不同尺度的特征的利用效率。

由于DenseNet的密集連接方式,在構(gòu)建一個(gè)相同容量的網(wǎng)絡(luò)時(shí)其所需的參數(shù)數(shù)量遠(yuǎn)小于其之前提出的如resnet等結(jié)構(gòu)。進(jìn)一步,個(gè)人感覺應(yīng)該可以把Dense塊看做對一個(gè)有較多參數(shù)的卷積層的高效替代。因此,其也可以結(jié)合U-Net等網(wǎng)絡(luò)結(jié)構(gòu),來進(jìn)一步優(yōu)化網(wǎng)絡(luò)性能,比如單純的把U-net中的所有卷積層全部換成DenseNet的結(jié)構(gòu),就可以顯著壓縮網(wǎng)絡(luò)大小。

下面基于Keras實(shí)現(xiàn)DenseNet-BC結(jié)構(gòu)。首先定義Dense層,根據(jù)論文描述構(gòu)建如下:

def DenseLayer(x, nb_filter, bn_size=4, alpha=0.0, drop_rate=0.2):
 
 # Bottleneck layers
 x = BatchNormalization(axis=3)(x)
 x = LeakyReLU(alpha=alpha)(x)
 x = Conv2D(bn_size*nb_filter, (1, 1), strides=(1,1), padding='same')(x)
 
 # Composite function
 x = BatchNormalization(axis=3)(x)
 x = LeakyReLU(alpha=alpha)(x)
 x = Conv2D(nb_filter, (3, 3), strides=(1,1), padding='same')(x)
 
 if drop_rate: x = Dropout(drop_rate)(x)
 
 return x

論文原文中提出使用1*1卷積核的卷積層作為bottleneck層來優(yōu)化計(jì)算效率。原文中使用的激活函數(shù)全部為relu,但個(gè)人習(xí)慣是用leakyrelu進(jìn)行構(gòu)建,來方便調(diào)參。

之后是用Dense層搭建Dense塊,如下:

def DenseBlock(x, nb_layers, growth_rate, drop_rate=0.2):
 
 for ii in range(nb_layers):
  conv = DenseLayer(x, nb_filter=growth_rate, drop_rate=drop_rate)
  x = concatenate([x, conv], axis=3)
 return x

如論文中所述,將每一個(gè)Dense層的輸出與其輸入融合之后作為下一Dense層的輸入,來實(shí)現(xiàn)密集連接。

最后是各Dense塊之間的過渡層,如下:

def TransitionLayer(x, compression=0.5, alpha=0.0, is_max=0):
 
 nb_filter = int(x.shape.as_list()[-1]*compression)
 x = BatchNormalization(axis=3)(x)
 x = LeakyReLU(alpha=alpha)(x)
 x = Conv2D(nb_filter, (1, 1), strides=(1,1), padding='same')(x)
 if is_max != 0: x = MaxPooling2D(pool_size=(2, 2), strides=2)(x)
 else: x = AveragePooling2D(pool_size=(2, 2), strides=2)(x)
 
 return x

論文中提出使用均值池化層來作下采樣,不過在邊緣特征提取方面,最大池化層效果應(yīng)該更好,這里就加了相關(guān)接口。

將上述結(jié)構(gòu)按照論文中提出的結(jié)構(gòu)進(jìn)行拼接,這里選擇的參數(shù)是論文中提到的L=100,k=12,網(wǎng)絡(luò)連接如下:

growth_rate = 12
inpt = Input(shape=(32,32,3))
 
x = Conv2D(growth_rate*2, (3, 3), strides=1, padding='same')(inpt)
x = BatchNormalization(axis=3)(x)
x = LeakyReLU(alpha=0.1)(x)
x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)
x = TransitionLayer(x)
x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)
x = TransitionLayer(x)
x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)
x = BatchNormalization(axis=3)(x)
x = GlobalAveragePooling2D()(x)
x = Dense(10, activation='softmax')(x)
 
model = Model(inpt, x)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

雖然我們已經(jīng)完成了網(wǎng)絡(luò)的架設(shè),網(wǎng)絡(luò)本身的參數(shù)數(shù)量也僅有0.5M,但由于以這種方式實(shí)現(xiàn)的網(wǎng)絡(luò)在Dense塊中,每一次concat均需要開辟一組全新的內(nèi)存空間,導(dǎo)致實(shí)際需要的內(nèi)存空間非常大。作者在17年的時(shí)候,還專門寫了相關(guān)的技術(shù)報(bào)告:https://arxiv.org/abs/1707.06990來說明怎么節(jié)省內(nèi)存空間,不過單純用keras實(shí)現(xiàn)起來是比較麻煩。下一篇博客中將以pytorch框架來對其進(jìn)行實(shí)現(xiàn)。

最后放出網(wǎng)絡(luò)完整代碼:

import numpy as np
import keras
from keras.models import Model, save_model, load_model
from keras.layers import Input, Dense, Dropout, BatchNormalization, LeakyReLU, concatenate
from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D, GlobalAveragePooling2D
 
## data
import pickle
 
data_batch_1 = pickle.load(open("cifar-10-batches-py/data_batch_1", 'rb'), encoding='bytes')
data_batch_2 = pickle.load(open("cifar-10-batches-py/data_batch_2", 'rb'), encoding='bytes')
data_batch_3 = pickle.load(open("cifar-10-batches-py/data_batch_3", 'rb'), encoding='bytes')
data_batch_4 = pickle.load(open("cifar-10-batches-py/data_batch_4", 'rb'), encoding='bytes')
data_batch_5 = pickle.load(open("cifar-10-batches-py/data_batch_5", 'rb'), encoding='bytes')
 
train_X_1 = data_batch_1[b'data']
train_X_1 = train_X_1.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float")
train_Y_1 = data_batch_1[b'labels']
 
train_X_2 = data_batch_2[b'data']
train_X_2 = train_X_2.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float")
train_Y_2 = data_batch_2[b'labels']
 
train_X_3 = data_batch_3[b'data']
train_X_3 = train_X_3.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float")
train_Y_3 = data_batch_3[b'labels']
 
train_X_4 = data_batch_4[b'data']
train_X_4 = train_X_4.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float")
train_Y_4 = data_batch_4[b'labels']
 
train_X_5 = data_batch_5[b'data']
train_X_5 = train_X_5.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float")
train_Y_5 = data_batch_5[b'labels']
 
train_X = np.row_stack((train_X_1, train_X_2))
train_X = np.row_stack((train_X, train_X_3))
train_X = np.row_stack((train_X, train_X_4))
train_X = np.row_stack((train_X, train_X_5))
 
train_Y = np.row_stack((train_Y_1, train_Y_2))
train_Y = np.row_stack((train_Y, train_Y_3))
train_Y = np.row_stack((train_Y, train_Y_4))
train_Y = np.row_stack((train_Y, train_Y_5))
train_Y = train_Y.reshape(50000, 1).transpose(0, 1).astype("int32")
train_Y = keras.utils.to_categorical(train_Y)
 
test_batch = pickle.load(open("cifar-10-batches-py/test_batch", 'rb'), encoding='bytes')
test_X = test_batch[b'data']
test_X = test_X.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float")
test_Y = test_batch[b'labels']
test_Y = keras.utils.to_categorical(test_Y)
 
train_X /= 255
test_X /= 255
 
# model
 
def DenseLayer(x, nb_filter, bn_size=4, alpha=0.0, drop_rate=0.2):
 
 # Bottleneck layers
 x = BatchNormalization(axis=3)(x)
 x = LeakyReLU(alpha=alpha)(x)
 x = Conv2D(bn_size*nb_filter, (1, 1), strides=(1,1), padding='same')(x)
 
 # Composite function
 x = BatchNormalization(axis=3)(x)
 x = LeakyReLU(alpha=alpha)(x)
 x = Conv2D(nb_filter, (3, 3), strides=(1,1), padding='same')(x)
 
 if drop_rate: x = Dropout(drop_rate)(x)
 
 return x
 
def DenseBlock(x, nb_layers, growth_rate, drop_rate=0.2):
 
 for ii in range(nb_layers):
  conv = DenseLayer(x, nb_filter=growth_rate, drop_rate=drop_rate)
  x = concatenate([x, conv], axis=3)
  
 return x
 
def TransitionLayer(x, compression=0.5, alpha=0.0, is_max=0):
 
 nb_filter = int(x.shape.as_list()[-1]*compression)
 x = BatchNormalization(axis=3)(x)
 x = LeakyReLU(alpha=alpha)(x)
 x = Conv2D(nb_filter, (1, 1), strides=(1,1), padding='same')(x)
 if is_max != 0: x = MaxPooling2D(pool_size=(2, 2), strides=2)(x)
 else: x = AveragePooling2D(pool_size=(2, 2), strides=2)(x)
 
 return x
 
growth_rate = 12
 
inpt = Input(shape=(32,32,3))
 
x = Conv2D(growth_rate*2, (3, 3), strides=1, padding='same')(inpt)
x = BatchNormalization(axis=3)(x)
x = LeakyReLU(alpha=0.1)(x)
x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)
x = TransitionLayer(x)
x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)
x = TransitionLayer(x)
x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)
x = BatchNormalization(axis=3)(x)
x = GlobalAveragePooling2D()(x)
x = Dense(10, activation='softmax')(x)
 
model = Model(inpt, x)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
 
model.summary()
 
for ii in range(10):
 print("Epoch:", ii+1)
 model.fit(train_X, train_Y, batch_size=100, epochs=1, verbose=1)
 score = model.evaluate(test_X, test_Y, verbose=1)
 print('Test loss =', score[0])
 print('Test accuracy =', score[1])
 
save_model(model, 'DenseNet.h5')
model = load_model('DenseNet.h5')
 
pred_Y = model.predict(test_X)
score = model.evaluate(test_X, test_Y, verbose=0)
print('Test loss =', score[0])
print('Test accuracy =', score[1])

以上這篇Keras實(shí)現(xiàn)DenseNet結(jié)構(gòu)操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 舉例講解Python中is和id的用法

    舉例講解Python中is和id的用法

    這篇文章主要介紹了舉例講解Python中is和id的用法,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,作者舉例進(jìn)行了簡單說明,需要的朋友可以參考下
    2015-04-04
  • Python字典實(shí)現(xiàn)簡單的三級菜單(實(shí)例講解)

    Python字典實(shí)現(xiàn)簡單的三級菜單(實(shí)例講解)

    下面小編就為大家?guī)硪黄狿ython字典實(shí)現(xiàn)簡單的三級菜單(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 快速下載VScode并配置Python運(yùn)行環(huán)境(圖文教程)

    快速下載VScode并配置Python運(yùn)行環(huán)境(圖文教程)

    本文主要介紹了快速下載VScode并配置Python運(yùn)行環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • pandas探索你的數(shù)據(jù)實(shí)現(xiàn)可視化示例詳解

    pandas探索你的數(shù)據(jù)實(shí)現(xiàn)可視化示例詳解

    這篇文章主要為大家介紹了pandas探索你的數(shù)據(jù)實(shí)現(xiàn)可視化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Python開發(fā)之os與os.path的使用小結(jié)

    Python開發(fā)之os與os.path的使用小結(jié)

    這篇文章主要介紹了Python開發(fā)之os與os.path的使用小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-05-05
  • Python range、enumerate和zip函數(shù)用法詳解

    Python range、enumerate和zip函數(shù)用法詳解

    這篇文章主要介紹了Python range、enumerate和zip函數(shù)用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python K最近鄰從原理到實(shí)現(xiàn)的方法

    Python K最近鄰從原理到實(shí)現(xiàn)的方法

    這篇文章主要介紹了Python K最近鄰從原理到實(shí)現(xiàn)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python?字符替換的四方法

    Python?字符替換的四方法

    本文主要介紹了Python?字符替換的四方法,主要包括replace、translate、maketrans?和正則這是四種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Python讀取Excel數(shù)據(jù)并生成圖表過程解析

    Python讀取Excel數(shù)據(jù)并生成圖表過程解析

    這篇文章主要介紹了Python讀取Excel數(shù)據(jù)并生成圖表過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python中模塊與包有相同名字的處理方法

    Python中模塊與包有相同名字的處理方法

    這篇文章主要給大家介紹了在Python中模塊與包有相同名字的處理方法,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-05-05

最新評論

香格里拉县| 中阳县| 九龙县| 海晏县| 辽阳市| 上蔡县| 巨野县| 吉林省| 合江县| 辽宁省| 响水县| 武汉市| 都江堰市| 治多县| 新乡县| 大港区| 潮州市| 全南县| 荔波县| 四会市| 格尔木市| 陵水| 巧家县| 龙口市| 晋城| 莲花县| 天全县| 富顺县| 洪湖市| 东莞市| 镇康县| 阜新| 隆子县| 珲春市| 清水县| 广安市| 温宿县| 类乌齐县| 砀山县| 宁化县| 曲阜市|