我有一个我在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])仍然未经训练
归档时间: |
|
查看次数: |
14344 次 |
最近记录: |