在keras模型中添加或删除上游层

在keras模型中添加或删除上游层,keras,Keras,我想修改keras输入层或将其附加到预训练的初始模型中。我知道。上游层呢 例如,我想添加一个层,它将获取我的输入图像并将其分为3个通道(我知道还有其他解决方案,但让我们试试): 结果是我无法像base\u model.input=img3那样轻松设置输入属性,这会引发异常 更新: 我实际上需要修改上游层和下游层。目前,我正在以以下方式裁剪网络中的下游层: n_classes = 1 final_activation = 'sigmoid' ndense=64 dropout=0.5 base_

我想修改keras输入层或将其附加到预训练的初始模型中。我知道。上游层呢

例如,我想添加一个层,它将获取我的输入图像并将其分为3个通道(我知道还有其他解决方案,但让我们试试):

结果是我无法像
base\u model.input=img3那样轻松设置输入属性,这会引发异常


更新: 我实际上需要修改上游层和下游层。目前,我正在以以下方式裁剪网络中的下游层:

n_classes = 1
final_activation = 'sigmoid'
ndense=64
dropout=0.5
base_trainable=False

base_model = InceptionV3(weights='imagenet', include_top=False)
img = Input(( None, None, 1))
d0 = Conv2D(3, (1,1), kernel_initializer='Ones', use_bias=False)
img3 = d0(img)
base_model(img3)

# get third Concatenation layer and crop the network on it:
cc=0
poptherest = False
for nn, la in enumerate(base_model.layers):
    if type(la) is keras.layers.Concatenate:
        if cc==3:
            x = la.output
            break
        cc+=1
base_model.layers = base_model.layers[:nn+1]

#x = [la.output for la in base_model.layers if type(la) is keras.layers.Concatenate][3]
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dropout(dropout)(x)

x = Dense(ndense, activation='relu')(x)
# and a logistic layer -- let's say we have 200 classes
predictions = Dense(n_classes, activation=final_activation)(x)

# this is the model we will train
model = Model(inputs=img, outputs=predictions)

如何将上述修改添加到我的代码中?

对于复杂模型,以及具有分支的模型,弹出/添加层的想法并不适用,因为它是针对顺序模型的

好消息是,使用函数式API
Model
几乎可以做任何事情

您的模型几乎正确,但无法设置“model.input”。但您可以将输入传递到模型,就像模型是一个层一样:

output = base_model(img3) #if an exception appears here, it's probably a shape problem
myModel = Model(img,output)
现在,您的输入有问题。不能使用“无”。没有为Keras保留以分离可变批量。您必须准确定义图像的大小,该大小应为:

img = Input((horizPixels,vertPixels,channels))  
请注意,img3张量必须具有与预期输入兼容的形状。如果inception需要三个通道图像,请确保您的img3的形状为(x,y,通道)或(无,x,y,通道)


我不确定我是否理解您想要实现的目标,但如果您的输入图像只有一个通道,并且您希望从中创建一个3通道图像,我建议您使用带有3个过滤器的卷积层:

d0 = Conv2D(filter=3, kernel_size=(3,3), .....)

但是,如果您想要一个不需要学习任何东西并且已经知道要做什么的层,那么最好在您的训练数据中自己分离图像,而不是将任务留给模型

有什么例外?谢谢。那么,如何将其添加到代码中以裁剪/替换下游层呢?(请参阅更新)我认为您只需删除这一行,它看起来就可以了:
base\u model.layers=base\u model.layers[:nn+1]
。base_模型的其余部分仍然存在,但不在您的模型中,只在旧模型中。因为您定义的“路径”不会流经其余的层,所以它将在那里不起作用。
d0 = Conv2D(filter=3, kernel_size=(3,3), .....)