如何在Keras的Sequential模型中改变输入形状

ita*_*ter 8 keras keras-layer

我有一个我在Keras建立的顺序模型.我试图弄清楚如何改变输入的形状.在以下示例中

model = Sequential()
model.add(Dense(32, input_shape=(500,)))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
      loss='categorical_crossentropy',
      metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

假设我想构建一个具有不同输入形状的新模型,概念性应该如下所示:

model1 = model
model1.layers[0] = Dense(32, input_shape=(250,))
Run Code Online (Sandbox Code Playgroud)

有没有办法修改模型输入形状?

oha*_*aty 11

有点相关,所以希望有人会觉得这很有用:如果你有一个现有的模型,其中输入是一个看起来像(无,无,无,3)的占位符,你可以加载模型,用一个替换第一层具体形状的输入.当你想在iOS CoreML中使用你的模型时,这种转换是非常有用的(在我的例子中,模型的输入是MLMultiArray而不是CVPixelBuffer,并且模型编译失败)

from keras.models import load_model
from keras import backend as K
from keras.engine import InputLayer
import coremltools

model = load_model('your_model.h5')

# Create a new input layer to replace the (None,None,None,3) input layer :
input_layer = InputLayer(input_shape=(272, 480, 3), name="input_1")

# Save and convert :
model.layers[0] = input_layer
model.save("reshaped_model.h5")    
coreml_model = coremltools.converters.keras.convert('reshaped_model.h5')    
coreml_model.save('MyPredictor.mlmodel')
Run Code Online (Sandbox Code Playgroud)


小智 5

想想在这种情况下改变输入形状意味着什么。

你的第一个模型

model.add(Dense(32, input_shape=(500,)))
Run Code Online (Sandbox Code Playgroud)

有一个真正是 500x32 矩阵的密集层。

如果将输入更改为 250 个元素,则图层的矩阵和输入维度将不匹配。

但是,如果您想要实现的是从前 500 个元素输入模型中重用最后一层的训练参数,则可以通过 get_weights 获得这些权重。然后您可以重建一个新模型并使用 set_weights 在新模型上设置值。

model1 = Sequential()
model1.add(Dense(32, input_shape=(250,)))
model1.add(Dense(10, activation='softmax'))
model1.layers[1].set_weights(model1.layers[1].get_weights())
Run Code Online (Sandbox Code Playgroud)

请记住,model1 的第一层(又名 model1.layers[0])仍然未经训练