没有在网上查到tensorflow2实现的vnet网络结构,自己写了一个,供自己和大家参考。
import warnings
warnings.filterwarnings("ignore")
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'from tensorflow.keras.layers import (Conv3D,PReLU,Input,Concatenate,Conv3DTranspose,)
from tensorflow.keras.models import Modeldef GetVnet(num_classes=2):inputs = Input(shape=(128,128,64,1),name='vnet_input')conv1 = Conv3D(16,5,padding='same',name='conv1')(inputs)conv1 = PReLU(name='conv1_prelu')(conv1) # activationconcat1 = Concatenate(name='concat1')([inputs,conv1])down_conv1 = Conv3D(32,2,2,name='down_conv_1')(concat1)down_conv1 = PReLU(name='down_conv1_prelu')(down_conv1)conv2_1 = Conv3D(32,5,padding='same',name='conv2_1')(down_conv1)conv2_1 = PReLU(name='conv2_1_prelu')(conv2_1)conv2_2 = Conv3D(32,5,padding='same',name='conv2_2')(conv2_1)conv2_2 = PReLU(name='conv2_2_prelu')(conv2_2)concat2 = Concatenate(name='concat2')([down_conv1,conv2_2])down_conv2 = Conv3D(64,2,2,name='down_conv2')(concat2)down_conv2 = PReLU(name='down_conv2_prelu')(down_conv2)conv3_1 = Conv3D(64,5,padding='same',name='conv3_1')(down_conv2)conv3_1 = PReLU(name='conv3_1_prelu')(conv3_1)conv3_2 = Conv3D(64,5,padding='same',name='conv3_2')(conv3_1)conv3_2 = PReLU(name='conv3_2_prelu')(conv3_2)conv3_3 = Conv3D(64,5,padding='same',name='conv3_3')(conv3_2)conv3_3 = PReLU(name='conv3_3_prelu')(conv3_3)concat3 = Concatenate(name='concat3')([conv3_3,down_conv2])down_conv3 = Conv3D(128,2,2,name='down_conv3')(concat3)down_conv3 = PReLU(name='down_conv3_prelu')(down_conv3)conv4_1 = Conv3D(128,5,padding='same',name='conv4_1')(down_conv3)conv4_1 = PReLU(name='conv4_1_prelu')(conv4_1)conv4_2 = Conv3D(128,5,padding='same',name='conv4_2')(conv4_1)conv4_2 = PReLU(name='conv4_2_prelu')(conv4_2)conv4_3 = Conv3D(128,5,padding='same',name='conv4_3')(conv4_2)conv4_3 = PReLU(name='conv4_3_prelu')(conv4_3)concat4 = Concatenate(name='concat4')([down_conv3,conv4_3])down_conv4 = Conv3D(256,2,2,name='down_conv4')(concat4)down_conv4 = PReLU(name='down_conv4_prelu')(down_conv4)conv5_1 = Conv3D(256,5,padding='same',name='conv5_1')(down_conv4)conv5_1 = PReLU(name='conv5_1_prelu')(conv5_1)conv5_2 = Conv3D(256,5,padding='same',name='conv5_2')(conv5_1)conv5_2 = PReLU(name='conv5_2_prelu')(conv5_2)conv5_3 = Conv3D(256,5,padding='same',name='conv5_3')(conv5_2)conv5_3 = PReLU(name='conv5_3_prelu')(conv5_3)concat5 = Concatenate(name='concat5')([down_conv4,conv5_3])up_conv5 = Conv3DTranspose(256,2,2,name='up_conv5')(concat5)up_conv5 = PReLU(name='up_conv5_prelu')(up_conv5)conv6 = Concatenate(name='conv6')([up_conv5,concat4])conv6_1 = Conv3D(256,5,padding='same',name='conv6_1')(conv6)conv6_1 = PReLU(name='conv6_1_prelu')(conv6_1)conv6_2 = Conv3D(256,5,padding='same',name='conv6_2')(conv6_1)conv6_2 = PReLU(name='conv6_2_prelu')(conv6_2)conv6_3 = Conv3D(256,5,padding='same',name='conv6_3')(conv6_2)conv6_3 = PReLU(name='conv6_3_prelu')(conv6_3)concat6 = Concatenate(name='concat6')([up_conv5,conv6_3])up_conv6 = Conv3DTranspose(128,2,2,name='up_conv6')(concat6)up_conv6 = PReLU(name='up_conv6_prelu')(up_conv6)conv7 = Concatenate(name='conv7')([up_conv6,concat3])""" 3次卷积 """for i in range(1,4):conv7 = Conv3D(128,5,padding='same',name=f'conv7_{i}')(conv7)conv7 = PReLU(name=f'conv7_{i}_prelu')(conv7)concat7 = Concatenate(name='concat7')([up_conv6,conv7])up_conv7 = Conv3DTranspose(64,2,2,name='up_conv7')(concat7)up_conv7 = PReLU(name='up_conv7_prelu')(up_conv7)conv8 = Concatenate(name='conv8')([up_conv7,concat2])""" 2次卷积 """for i in range(1,3):conv8 = Conv3D(64,5,padding='same',name=f'conv8_{i}')(conv8)conv8 = PReLU(name=f'conv8_{i}_prelu')(conv8)concat8 = Concatenate(name='concat8')([conv8,up_conv7])up_conv8 = Conv3DTranspose(32,2,2,name='up_conv8')(concat8)up_conv8 = PReLU(name='up_conv8_prelu')(up_conv8)conv9 = Concatenate(name='conv9')([up_conv8,concat1])conv9_1 = Conv3D(32,5,padding='same',name='conv9_1')(conv9)concat9 = Concatenate(name='concat9')([conv9_1,up_conv8])conv10 = Conv3D(num_classes,1,1,name='out',activation='softmax')(concat9)model = Model(inputs=inputs,outputs=conv10,name='myTf2_vnet')return modelif __name__ == '__main__':model = GetVnet()model.summary()
输出:
D:\program\miniconda\envs\py38_tf2\python.exe E:/paper/nets/vnet/Vnet.py
Model: "myTf2_vnet"
__________________________________________________________________________________________________Layer (type) Output Shape Param # Connected to
==================================================================================================vnet_input (InputLayer) [(None, 128, 128, 6 0 [] 4, 1)] conv1 (Conv3D) (None, 128, 128, 64 2016 ['vnet_input[0][0]'] , 16) conv1_prelu (PReLU) (None, 128, 128, 64 16777216 ['conv1[0][0]'] , 16) concat1 (Concatenate) (None, 128, 128, 64 0 ['vnet_input[0][0]', , 17) 'conv1_prelu[0][0]'] down_conv_1 (Conv3D) (None, 64, 64, 32, 4384 ['concat1[0][0]'] 32) down_conv1_prelu (PReLU) (None, 64, 64, 32, 4194304 ['down_conv_1[0][0]'] 32) conv2_1 (Conv3D) (None, 64, 64, 32, 128032 ['down_conv1_prelu[0][0]'] 32) conv2_1_prelu (PReLU) (None, 64, 64, 32, 4194304 ['conv2_1[0][0]'] 32) conv2_2 (Conv3D) (None, 64, 64, 32, 128032 ['conv2_1_prelu[0][0]'] 32) conv2_2_prelu (PReLU) (None, 64, 64, 32, 4194304 ['conv2_2[0][0]'] 32) concat2 (Concatenate) (None, 64, 64, 32, 0 ['down_conv1_prelu[0][0]', 64) 'conv2_2_prelu[0][0]'] down_conv2 (Conv3D) (None, 32, 32, 16, 32832 ['concat2[0][0]'] 64) down_conv2_prelu (PReLU) (None, 32, 32, 16, 1048576 ['down_conv2[0][0]'] 64) conv3_1 (Conv3D) (None, 32, 32, 16, 512064 ['down_conv2_prelu[0][0]'] 64) conv3_1_prelu (PReLU) (None, 32, 32, 16, 1048576 ['conv3_1[0][0]'] 64) conv3_2 (Conv3D) (None, 32, 32, 16, 512064 ['conv3_1_prelu[0][0]'] 64) conv3_2_prelu (PReLU) (None, 32, 32, 16, 1048576 ['conv3_2[0][0]'] 64) conv3_3 (Conv3D) (None, 32, 32, 16, 512064 ['conv3_2_prelu[0][0]'] 64) conv3_3_prelu (PReLU) (None, 32, 32, 16, 1048576 ['conv3_3[0][0]'] 64) concat3 (Concatenate) (None, 32, 32, 16, 0 ['conv3_3_prelu[0][0]', 128) 'down_conv2_prelu[0][0]'] down_conv3 (Conv3D) (None, 16, 16, 8, 1 131200 ['concat3[0][0]'] 28) down_conv3_prelu (PReLU) (None, 16, 16, 8, 1 262144 ['down_conv3[0][0]'] 28) conv4_1 (Conv3D) (None, 16, 16, 8, 1 2048128 ['down_conv3_prelu[0][0]'] 28) conv4_1_prelu (PReLU) (None, 16, 16, 8, 1 262144 ['conv4_1[0][0]'] 28) conv4_2 (Conv3D) (None, 16, 16, 8, 1 2048128 ['conv4_1_prelu[0][0]'] 28) conv4_2_prelu (PReLU) (None, 16, 16, 8, 1 262144 ['conv4_2[0][0]'] 28) conv4_3 (Conv3D) (None, 16, 16, 8, 1 2048128 ['conv4_2_prelu[0][0]'] 28) conv4_3_prelu (PReLU) (None, 16, 16, 8, 1 262144 ['conv4_3[0][0]'] 28) concat4 (Concatenate) (None, 16, 16, 8, 2 0 ['down_conv3_prelu[0][0]', 56) 'conv4_3_prelu[0][0]'] down_conv4 (Conv3D) (None, 8, 8, 4, 256 524544 ['concat4[0][0]'] ) down_conv4_prelu (PReLU) (None, 8, 8, 4, 256 65536 ['down_conv4[0][0]'] ) conv5_1 (Conv3D) (None, 8, 8, 4, 256 8192256 ['down_conv4_prelu[0][0]'] ) conv5_1_prelu (PReLU) (None, 8, 8, 4, 256 65536 ['conv5_1[0][0]'] ) conv5_2 (Conv3D) (None, 8, 8, 4, 256 8192256 ['conv5_1_prelu[0][0]'] ) conv5_2_prelu (PReLU) (None, 8, 8, 4, 256 65536 ['conv5_2[0][0]'] ) conv5_3 (Conv3D) (None, 8, 8, 4, 256 8192256 ['conv5_2_prelu[0][0]'] ) conv5_3_prelu (PReLU) (None, 8, 8, 4, 256 65536 ['conv5_3[0][0]'] ) concat5 (Concatenate) (None, 8, 8, 4, 512 0 ['down_conv4_prelu[0][0]', ) 'conv5_3_prelu[0][0]'] up_conv5 (Conv3DTranspose) (None, 16, 16, 8, 2 1048832 ['concat5[0][0]'] 56) up_conv5_prelu (PReLU) (None, 16, 16, 8, 2 524288 ['up_conv5[0][0]'] 56) conv6 (Concatenate) (None, 16, 16, 8, 5 0 ['up_conv5_prelu[0][0]', 12) 'concat4[0][0]'] conv6_1 (Conv3D) (None, 16, 16, 8, 2 16384256 ['conv6[0][0]'] 56) conv6_1_prelu (PReLU) (None, 16, 16, 8, 2 524288 ['conv6_1[0][0]'] 56) conv6_2 (Conv3D) (None, 16, 16, 8, 2 8192256 ['conv6_1_prelu[0][0]'] 56) conv6_2_prelu (PReLU) (None, 16, 16, 8, 2 524288 ['conv6_2[0][0]'] 56) conv6_3 (Conv3D) (None, 16, 16, 8, 2 8192256 ['conv6_2_prelu[0][0]'] 56) conv6_3_prelu (PReLU) (None, 16, 16, 8, 2 524288 ['conv6_3[0][0]'] 56) concat6 (Concatenate) (None, 16, 16, 8, 5 0 ['up_conv5_prelu[0][0]', 12) 'conv6_3_prelu[0][0]'] up_conv6 (Conv3DTranspose) (None, 32, 32, 16, 524416 ['concat6[0][0]'] 128) up_conv6_prelu (PReLU) (None, 32, 32, 16, 2097152 ['up_conv6[0][0]'] 128) conv7 (Concatenate) (None, 32, 32, 16, 0 ['up_conv6_prelu[0][0]', 256) 'concat3[0][0]'] conv7_1 (Conv3D) (None, 32, 32, 16, 4096128 ['conv7[0][0]'] 128) conv7_1_prelu (PReLU) (None, 32, 32, 16, 2097152 ['conv7_1[0][0]'] 128) conv7_2 (Conv3D) (None, 32, 32, 16, 2048128 ['conv7_1_prelu[0][0]'] 128) conv7_2_prelu (PReLU) (None, 32, 32, 16, 2097152 ['conv7_2[0][0]'] 128) conv7_3 (Conv3D) (None, 32, 32, 16, 2048128 ['conv7_2_prelu[0][0]'] 128) conv7_3_prelu (PReLU) (None, 32, 32, 16, 2097152 ['conv7_3[0][0]'] 128) concat7 (Concatenate) (None, 32, 32, 16, 0 ['up_conv6_prelu[0][0]', 256) 'conv7_3_prelu[0][0]'] up_conv7 (Conv3DTranspose) (None, 64, 64, 32, 131136 ['concat7[0][0]'] 64) up_conv7_prelu (PReLU) (None, 64, 64, 32, 8388608 ['up_conv7[0][0]'] 64) conv8 (Concatenate) (None, 64, 64, 32, 0 ['up_conv7_prelu[0][0]', 128) 'concat2[0][0]'] conv8_1 (Conv3D) (None, 64, 64, 32, 1024064 ['conv8[0][0]'] 64) conv8_1_prelu (PReLU) (None, 64, 64, 32, 8388608 ['conv8_1[0][0]'] 64) conv8_2 (Conv3D) (None, 64, 64, 32, 512064 ['conv8_1_prelu[0][0]'] 64) conv8_2_prelu (PReLU) (None, 64, 64, 32, 8388608 ['conv8_2[0][0]'] 64) concat8 (Concatenate) (None, 64, 64, 32, 0 ['conv8_2_prelu[0][0]', 128) 'up_conv7_prelu[0][0]'] up_conv8 (Conv3DTranspose) (None, 128, 128, 64 32800 ['concat8[0][0]'] , 32) up_conv8_prelu (PReLU) (None, 128, 128, 64 33554432 ['up_conv8[0][0]'] , 32) conv9 (Concatenate) (None, 128, 128, 64 0 ['up_conv8_prelu[0][0]', , 49) 'concat1[0][0]'] conv9_1 (Conv3D) (None, 128, 128, 64 196032 ['conv9[0][0]'] , 32) concat9 (Concatenate) (None, 128, 128, 64 0 ['conv9_1[0][0]', , 64) 'up_conv8_prelu[0][0]'] out (Conv3D) (None, 128, 128, 64 130 ['concat9[0][0]'] , 2) ==================================================================================================
Total params: 181,710,178
Trainable params: 181,710,178
Non-trainable params: 0
__________________________________________________________________________________________________Process finished with exit code 0