Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何展平嵌套模型?(keras功能API)_Python_Tensorflow_Keras - Fatal编程技术网

Python 如何展平嵌套模型?(keras功能API)

Python 如何展平嵌套模型?(keras功能API),python,tensorflow,keras,Python,Tensorflow,Keras,我使用keras模型函数API定义了一个简单的模型。它的一个层是一个完全连续的模型,所以我得到了一个嵌套的层结构(见下图) 如何将此嵌套层结构转换为平面层结构?(使用脚本,而不是手动…) 我所拥有的: 我想将其转换为: 生成嵌套层结构的代码: def create_network_with_one_subnet(): # define subnetwork subnet = keras.models.Sequential() subnet.add(keras.la

我使用keras模型函数API定义了一个简单的模型。它的一个层是一个完全连续的模型,所以我得到了一个嵌套的层结构(见下图)

如何将此嵌套层结构转换为平面层结构?(使用脚本,而不是手动…)


我所拥有的:

我想将其转换为:


生成嵌套层结构的代码:

def create_network_with_one_subnet():
    # define subnetwork
    subnet = keras.models.Sequential()
    subnet.add(keras.layers.Conv2D(6, (3, 3), padding='same'))
    subnet.add(keras.layers.MaxPool2D())
    subnet.add(keras.layers.Conv2D(12, (3, 3), padding='same'))
    subnet.add(keras.layers.MaxPool2D())
    #subnet.summary()


    # define complete network
    input_shape = (32, 32, 1)
    net_in = keras.layers.Input(shape=input_shape)
    net_out = subnet(net_in)
    net_out = keras.layers.Flatten()(net_out)
    net_out = keras.layers.Dense(1)(net_out)
    net_complete = keras.Model(inputs=net_in, outputs=net_out)
    net_complete.compile(loss='binary_crossentropy',
                         optimizer=keras.optimizers.Adam(lr=0.001),
                         metrics=['acc'],
                         )
    net_complete.summary()
    return net_complete

啊,比预想的容易多了。在谷歌搜索正确的关键字后,解决方案如下:


处理具有多个级别的嵌套模型的更好解决方案:

def flatten_model(model_nested):
    def get_layers(layers):
        layers_flat = []
        for layer in layers:
            try:
                layers_flat.extend(get_layers(layer.layers))
            except AttributeError:
                layers_flat.append(layer)
        return layers_flat

    model_flat = tfk.models.Sequential(
        get_layers(model_nested.layers)
    )
    return model_flat

什么是tfk?tensorflow.kerashis不适用于连接/添加层!!!
def create_network_with_one_subnet():
    # define subnetwork
    subnet = keras.models.Sequential()
    subnet.add(keras.layers.Conv2D(6, (3, 3), padding='same'))
    subnet.add(keras.layers.MaxPool2D())
    subnet.add(keras.layers.Conv2D(12, (3, 3), padding='same'))
    subnet.add(keras.layers.MaxPool2D())
    #subnet.summary()


    # define complete network
    input_shape = (32, 32, 1)
    net_in = keras.layers.Input(shape=input_shape)
    net_out = subnet(net_in)
    net_out = keras.layers.Flatten()(net_out)
    net_out = keras.layers.Dense(1)(net_out)
    net_complete = keras.Model(inputs=net_in, outputs=net_out)
    net_complete.compile(loss='binary_crossentropy',
                         optimizer=keras.optimizers.Adam(lr=0.001),
                         metrics=['acc'],
                         )
    net_complete.summary()
    return net_complete
def flatten_model(model_nested):
    layers_flat = []
    for layer in model_nested.layers:
        try:
            layers_flat.extend(layer.layers)
        except AttributeError:
            layers_flat.append(layer)
    model_flat = keras.models.Sequential(layers_flat)
    return model_flat
def flatten_model(model_nested):
    def get_layers(layers):
        layers_flat = []
        for layer in layers:
            try:
                layers_flat.extend(get_layers(layer.layers))
            except AttributeError:
                layers_flat.append(layer)
        return layers_flat

    model_flat = tfk.models.Sequential(
        get_layers(model_nested.layers)
    )
    return model_flat