Keras replacing input layer

前端 未结 6 2127
清酒与你
清酒与你 2020-11-30 07:29

The code that I have (that I can\'t change) uses the Resnet with my_input_tensor as the input_tensor.

model1 = keras.applications.resnet50.ResNe         


        
6条回答
  •  悲哀的现实
    2020-11-30 08:10

    The solution from @MilindDeore did not work for me, unfortunately. While I can print the summary of the new model, I receive a "Matrix size incompatible" error upon prediction. I guess this makes sense, since the new input shape of the dense layer does not match the shape of the old dense layer weights.

    Thus, here is another solution. The key for me was to use "_layers" instead of "layers". The latter only seems to return a copy.

    import keras
    import numpy as np
    
    def get_model():
        old_input_shape = (20, 20, 3)
        model = keras.models.Sequential()
        model.add(keras.layers.Conv2D(9, (3, 3), padding="same", input_shape=old_input_shape))
        model.add(keras.layers.MaxPooling2D((2, 2)))
        model.add(keras.layers.Flatten())
        model.add(keras.layers.Dense(1, activation="sigmoid"))
        model.compile(loss='binary_crossentropy', optimizer=keras.optimizers.Adam(lr=0.0001), metrics=['acc'], )
        model.summary()
        return model
    
    def change_model(model, new_input_shape=(None, 40, 40, 3)):
        # replace input shape of first layer
        model._layers[1].batch_input_shape = new_input_shape
    
        # feel free to modify additional parameters of other layers, for example...
        model._layers[2].pool_size = (8, 8)
        model._layers[2].strides = (8, 8)
    
        # rebuild model architecture by exporting and importing via json
        new_model = keras.models.model_from_json(model.to_json())
        new_model.summary()
    
        # copy weights from old model to new one
        for layer in new_model.layers:
            try:
                layer.set_weights(model.get_layer(name=layer.name).get_weights())
            except:
                print("Could not transfer weights for layer {}".format(layer.name))
    
        # test new model on a random input image
        X = np.random.rand(10, 40, 40, 3)
        y_pred = new_model.predict(X)
        print(y_pred)
    
        return new_model
    
    if __name__ == '__main__':
        model = get_model()
        new_model = change_model(model)
    

提交回复
热议问题