Python Keras中VGG16的输入层
我正在构建一个U-Net,我想使用预训练模型(VGG16)作为解码器部分 挑战在于我有灰度图像,而VGG使用RGB 我找到了一个将其转换为RGB的函数(通过连接): 但我没能把它插入模型。Python Keras中VGG16的输入层,python,keras,Python,Keras,我正在构建一个U-Net,我想使用预训练模型(VGG16)作为解码器部分 挑战在于我有灰度图像,而VGG使用RGB 我找到了一个将其转换为RGB的函数(通过连接): 但我没能把它插入模型。Gray2VGGInput是一个层,因此我正在寻找一种方法,如何将此层连接到VGG中的层。以下是我的尝试: def UNET1_VGG16(): ''' UNET with pretrained layers from VGG16 ''' def upsampleLayer(i
Gray2VGGInput
是一个层,因此我正在寻找一种方法,如何将此层连接到VGG中的层。以下是我的尝试:
def UNET1_VGG16():
'''
UNET with pretrained layers from VGG16
'''
def upsampleLayer(in_layer, concat_layer, input_size):
'''
Upsampling (=Decoder) layer building block
Parameters
----------
in_layer: input layer
concat_layer: layer with which to concatenate
input_size: input size fot convolution
'''
upsample = Conv2DTranspose(input_size, (2, 2), strides=(2, 2), padding='same')(in_layer)
upsample = concatenate([upsample, concat_layer])
conv = Conv2D(input_size, (1, 1), activation='relu', kernel_initializer='he_normal', padding='same')(upsample)
conv = BatchNormalization()(conv)
conv = Dropout(0.2)(conv)
conv = Conv2D(input_size, (1, 1), activation='relu', kernel_initializer='he_normal', padding='same')(conv)
conv = BatchNormalization()(conv)
return conv
img_rows = 864
img_cols = 1232
#--------
#INPUT
#--------
#batch, height, width, channels
inputs_1 = Input((img_rows, img_cols, 1))
inputs_3 = Input((img_rows, img_cols, 3))
#--------
#VGG16 BASE
#--------
#Prepare net
base_VGG16 = VGG16(input_tensor=inputs_3,
include_top=False,
weights='imagenet')
#----------------
#INPUT CONVERTER
#----------------
#This is the problematic part
vgg_inputs_3 = Gray2VGGInput(name='gray_to_rgb')(inputs_1)
model_input = Model(inputs=[inputs_1], outputs=[vgg_inputs_3])
new_outputs = base_VGG16(model_input.output)
new_inputs = Model(inputs_1, new_outputs)
#--------
#DECODER
#--------
c1 = base_VGG16.get_layer("block1_conv2").output #(None, 864, 1232, 64)
c2 = base_VGG16.get_layer("block2_conv2").output #(None, 432, 616, 128)
c3 = base_VGG16.get_layer("block3_conv2").output #(None, 216, 308, 256)
c4 = base_VGG16.get_layer("block4_conv2").output #(None, 108, 154, 512)
#--------
#BOTTLENECK
#--------
c5 = base_VGG16.get_layer("block5_conv2").output #(None, 54, 77, 512)
#--------
#ENCODER
#--------
c6 = upsampleLayer(in_layer=c5, concat_layer=c4, input_size=512)
c7 = upsampleLayer(in_layer=c6, concat_layer=c3, input_size=256)
c8 = upsampleLayer(in_layer=c7, concat_layer=c2, input_size=128)
c9 = upsampleLayer(in_layer=c8, concat_layer=c1, input_size=64)
#--------
#DENSE OUTPUT
#--------
outputs = Conv2D(1, (1, 1), activation='sigmoid')(c9)
model = Model(inputs=[new_inputs.input], outputs=[outputs])
#Freeze layers
for layer in model.layers[:16]:
layer.trainable = False
print(model.summary())
model.compile(optimizer='adam',
loss=fr.diceCoefLoss,
metrics=[fr.diceCoef])
return model
我发现以下错误:
ValueError:图形已断开连接:无法获取“input_14”层的张量张量(“input_14:0”,shape=(?,864,1232,3),dtype=float32)的值。访问以下以前的层时没有问题:[]
更改:
model_input = Model(inputs=[inputs_1], outputs=[vgg_inputs_3])
到
我认为您不需要多个输入,而是将
Gray2VGGInput
层输出作为输入传递给VGG16
模型。我认为如何从VGG16
模型中得到输出张量是可以的。我可以提出以下建议:
from keras.applications import VGG16
inputs_1 = Input(shape=(img_rows, img_cols, 1))
inputs_3 = Gray2VGGInput(name='gray_to_rgb')(inputs_1) #shape=(img_rows, img_cols, 3)
base_VGG16 = VGG16(include_top=False, weights='imagenet', input_tensor=inputs_3)
#--------
#DECODER
#--------
c1 = base_VGG16.get_layer("block1_conv2").output #(None, 864, 1232, 64)
c2 = base_VGG16.get_layer("block2_conv2").output #(None, 432, 616, 128)
c3 = base_VGG16.get_layer("block3_conv2").output #(None, 216, 308, 256)
c4 = base_VGG16.get_layer("block4_conv2").output #(None, 108, 154, 512)
#--------
#BOTTLENECK
#--------
c5 = base_VGG16.get_layer("block5_conv2").output #(None, 54, 77, 512)
...
... and so on
该模型可以称为
model = Model(inputs=inputs_1, outputs=outputs)
你可以试试看,让我知道它是否有效。我没有测试它,所以可能会出错。按如下方式替换代码:
model\u input=model(inputs=[vgg\u inputs\u 3],outputs=[vgg\u inputs\u 3])
会导致相同的错误消息。您的“models”太多了。一次对model()的调用就足够了。对于每个层或子模型,都可以使用语法B=layer()(A)。更易于阅读和调试。是的,将“输入层”与VGG和编码器层结合起来是一次不顾一切的尝试。我不知道如何使用输入层,将其用于VGG,然后添加编码器。乐意帮助:)
from keras.applications import VGG16
inputs_1 = Input(shape=(img_rows, img_cols, 1))
inputs_3 = Gray2VGGInput(name='gray_to_rgb')(inputs_1) #shape=(img_rows, img_cols, 3)
base_VGG16 = VGG16(include_top=False, weights='imagenet', input_tensor=inputs_3)
#--------
#DECODER
#--------
c1 = base_VGG16.get_layer("block1_conv2").output #(None, 864, 1232, 64)
c2 = base_VGG16.get_layer("block2_conv2").output #(None, 432, 616, 128)
c3 = base_VGG16.get_layer("block3_conv2").output #(None, 216, 308, 256)
c4 = base_VGG16.get_layer("block4_conv2").output #(None, 108, 154, 512)
#--------
#BOTTLENECK
#--------
c5 = base_VGG16.get_layer("block5_conv2").output #(None, 54, 77, 512)
...
... and so on
model = Model(inputs=inputs_1, outputs=outputs)