unet 层_以VGG16为特征抽取器的类Unet体系结构与连接层的问题

我想构建一个U-net架构,使用vgg16模型作为编码器,在Imagenet数据集上预先训练权重。对于上采样,我想将编码器中某些层的输出与解码部分连接起来。差不多是这样的(摘自TernausNet):

TernausNet

到目前为止,我的模型是这样的:from keras.applications.vgg16 import VGG16 as VGG16, preprocess_input

encode_model = VGG16(input_shape=(768,768,3), include_top=False, weights='imagenet')

encode_model.trainable = False

from keras import models, layers

input_img = layers.Input((768,768,3), name = 'RGB_Input')

# output and start upsampling

features = encode_model(input_img)

conv_1 = layers.Conv2D(512, (3,3), activation='relu', padding='same')(features)

up_conv = layers.Conv2DTranspose(256, (3,3), strides=(2,2), activation='relu', padding='same')(conv_1)

# first concatenation block

concat_1 = layers.concatenate([encode_model.get_layer('block5_conv3').output, up_conv], axis=-1, name='concat_1')

conv_2 = layers.Conv2D(512, (3,3), activation='relu', padding='same')(concat_1)

up_conv_2 = layers.Conv2DTranspose(256, (3,3), strides=(2,2), activation='relu', padding='same')(conv_2)

# second concatenation block

concat_2 = layers.concatenate([up_conv_2, encode_model.get_layer('block4_conv3').output])

conv_3 = layers.Conv2D(512, (3,3), activation='relu', padding='same')(concat_2)

up_conv_3 = layers.Conv2DTranspose(128, (3,3), strides=(2,2), activation='relu', padding='same')(conv_3)

# third concatenation block

concat_3 = layers.concatenate([up_conv_3, encode_model.get_layer('block3_conv3').output])

conv_4 = layers.Conv2D(256, (3,3), activation='relu', padding='same')(concat_3)

up_conv_4 = layers.Conv2DTranspose(64, (3,3), strides=(2,2), activation='relu', padding='same')(conv_4)

# fourth concatenation block

concat_4 = layers.concatenate([up_conv_4, encode_model.get_layer('block2_conv2').output])

conv_5 = layers.Conv2D(128, (3,3), activation='relu', padding='same')(concat_4)

up_conv_5 = layers.Conv2DTranspose(32, (3,3), strides=(2,2), activation='relu', padding='same')(conv_5)

# fifth concatenation block

concat_4 = layers.concatenate([up_conv_5, encode_model.get_layer('block1_conv2').output])

conv_6 = layers.Conv2D(128, (3,3), activation='sigmoid', padding='same')(concat_4)

final_model = models.Model(inputs=[input_img], outputs=[conv_6])

final_model.summary()

后来我编译并拟合模型:

^{pr2}$

然后我得到以下错误:Graph disconnected: cannot obtain value for tensor Tensor("input_4:0", shape=(?, 768, 768, 3), dtype=float32) at layer "input_4". The following previous layers were accessed without issue: []

我读到当输入和输出不是同一个图的一部分时就会发生这种情况。我想我可以把这两个图联系起来:input_img = layers.Input((768,768,3), name = 'RGB_Input')

# output and start upsampling

features = encode_model(input_img)

conv_1 = layers.Conv2D(512, (3,3), activation='relu', padding='same')(features)

我的错误是什么?在


版权声明:本文为weixin_29769523原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。