我想将keras输入层修改或附加到预训练的初始模型。我知道there is a way to pop and append downstream layers。上游层怎么样?
例如,我想添加一个图层,它将获取我的输入图像并将其分成3个通道(我知道还有其他解决方案,但让我们尝试一下):
from keras.applications.inception_v3 import InceptionV3
from keras.models import Model
from keras.layers import Dense,
base_model = InceptionV3(weights='imagenet', include_top=False)
img = Input(( None, None, 1))
d0 = Dense(3,kernel_initializer='Ones', use_bias=False)
img3 = d0(img)
它变成我不能像base_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)
如何将上述修改添加到我的代码中?
答案 0 :(得分:1)
对于复杂模型,以及必须具有分支的模型,弹出/添加图层的想法不适用,因为它适用于顺序模型。
好消息是使用功能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张量必须具有与初始预期输入兼容的形状。如果开始期待三个通道图像,请确保您的img3形状像(x,y,通道)或(无,x,y,通道)。
我不确定我是否理解你想要达到的目标,但是如果你的输入图像只有一个通道并且你想从中创建一个3通道图像,我建议你使用带有3个滤镜的卷积层:
d0 = Conv2D(filter=3, kernel_size=(3,3), .....)
但是如果你想要一个不学习任何东西并且已经知道该做什么的图层,也许最好只在训练数据中自己分离图像,而不是将任务留给模型。