如何从Squential调用层的输出?

2024-06-07 16:50:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我确实喜欢使用顺序模型在Keras中构建基本的UNet模型,使用简单的模块化函数进行下采样路径和上采样路径

正如您所看到的,我试图对其进行编码,但我得到了错误:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\Seq_UNet.py", line 56, in <module>
    model = UNet(128,128,1)
  File "C:\Users\User\Desktop\Seq_UNet.py", line 36, in UNet
    x1, l1 = ConvBlock(16)(s)
TypeError: 'tuple' object is not callable'

如何获得特定层上的顺序模型的输出

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
import keras

def ConvBlock(num_features):
    model = keras.Sequential([
        keras.layers.Conv2D(num_features,(3,3),activation='relu',kernel_initializer='he_normal', padding='same'),
        keras.layers.BatchNormalization(epsilon=1e-06,  momentum=0.9, weights=None),
        keras.layers.Dropout(0.1),
        keras.layers.Conv2D(num_features,(3,3),activation='relu',kernel_initializer='he_normal', padding='same'),
        keras.layers.MaxPooling2D((2,2)) ])
    return model, model.layers[3]

def ConvTransposeBlock(num_features, layer):
    model = keras.Sequential([
        keras.layers.Conv2DTranspose(num_features,(2,2),strides=(2,2),padding='same'),
        keras.layers.concatenate([model.layer[0],layer]), # The past layer (model.layer[0])
        keras.layers.Conv2D(num_features,(3,3),activation='relu',kernel_initializer='he_normal', padding='same'),
        keras.layers.BatchNormalization(epsilon=1e-06,  momentum=0.9, weights=None),
        keras.layers.Dropout(0.2),
        keras.layers.Conv2D(num_features,(3,3),activation='relu',kernel_initializer='he_normal', padding='same') ])
    return model 

# Initialization
IMG_Width  = 128
IMG_Height = 128
IMG_Channels = 1

# Model
def UNet(IMG_Width=IMG_Width, IMG_Height=IMG_Height,IMG_Channels=IMG_Channels):
    # Input Layer
    inputs = keras.layers.Input((IMG_Width,IMG_Height,IMG_Channels))
    # Convert integer inputs to floating point
    s = keras.layers.Lambda(lambda x: x / 255)(inputs) 
    # Contraction path:
    x1, l1 = ConvBlock(16)(s)
    x2, l2 = ConvBlock(32)(x1)
    x3, l3 = ConvBlock(64)(x2)
    x4, l4= ConvBlock(128)(x3)
    x5,_ = ConvBlock(256)(x4)
    # Expansion path:
    x6 = ConvTransposeBlock(128,l4)(x5)
    x7 = ConvTransposeBlock( 64,l3)(x6)
    x8 = ConvTransposeBlock( 32,l2)(x7)
    x9 = ConvTransposeBlock( 16,l1)(x8)

    outputs = keras.layers.Conv2D(1,(1,1), activation='sigmoid')(x9)

    model = keras.Model(inputs=[inputs],outputs=[outputs])

    optimizer = keras.optimizers.Adam(lr=1e-4)
    model.compile(optimizer=optimizer,loss=bce_dice_loss,metrics=['accuracy'])

    return model

model = UNet(128,128,1)

Tags: layerunetimgmodellayersactivationnumkeras
2条回答

编辑此行输入=keras.layers.Input((IMG_宽度、IMG_高度、IMG_通道、IMG_通道))

将来 输入=keras.layers.Input((IMG_宽度、IMG_高度、IMG_通道))

你写了两个IMG_频道

在这一行中,返回模型model.layer[3]您忘记了“s”。 您必须编写返回模型,model.layers[3]

相关问题 更多 >

    热门问题