gpt4 book ai didi

python - Keras条件传递一个模型输出到另一个模型

转载 作者:行者123 更新时间:2023-12-03 16:18:30 31 4
gpt4 key购买 nike

我正在尝试在喀拉斯邦的神经网络,它首先检查它是猫还是狗(基本模型)。

如果是狗,则通过另一个模型(子模型1)

如果是猫,则通过另一个模型(子模型2)

子模型是经过专门训练以根据品种进行分类的小型模型。因此,子模型1会将狗归类为各种狗的品种。 。而子模型2会将猫分类为各种猫的品种。

我面临的问题是:
我不知道如何添加条件层,因此,如果基本模型具有500万个神经元,而每个子模型具有200万-200万个神经元..如果图像通过基本模型,则只能通过子模型1或sub-model2 ..因此,将一幅图像传递到最终输出时,总共只有700万个神经元在起作用。

任何帮助,引用,一切都会很明显。

enter image description here

最佳答案

这是另一种解决方案,与此处列出的替代方案相比,它可以训练更快,运行更​​快并且使用更少的RAM,提供更好的性能并且更易于使用。
只需使用具有多个输出的单个模型:二进制输出(猫/狗),猫品种输出(多类)和狗品种输出(多类)。在训练过程中,您可以使用自定义损失功能来忽略与错误物种相对应的损失(例如,忽略狗图像的猫品种输出)。
好处是:

  • 更快的培训:只需训练一种模型。
  • 更好的性能:这样进行多任务学习时,通常可以得到更好的性能。那是因为狗图像和猫图像有很多共同点,因此为二者训练一个单一的基础神经网络,然后在此基础上构建专用网络很有帮助。
  • 更少的RAM和更少的计算:不必通过两个CNN(一个用于猫/狗检测器,一个用于品种),我们只需经过一个(基本网络)。即使通过猫/狗检测器说它是猫,也可以通过通过狗的品种分类器来很大程度上补偿我们所做的不必要的计算。
  • 易于使用:只需调用一次模型,即可立即获得所需的一切。而且,如果猫/狗检测器不太确定(例如,它输出50%的概率),那么您至少可以为猫和狗都拥有合理的候选对象。

  • 这是一个工作示例。您只需要用自己的数据替换即可。请注意,有三个标签:
  • 猫/狗:例如,狗,猫,猫,狗的[0,1,1,0]
  • 猫的品种:例如[-1,2,0,-1]表示非猫,第二猫类,第0猫类,非猫
  • 狗的品种:例如,第三类狗,非狗类,非狗类,第一类狗的[3,-1,-1,1]

  • import numpy as np
    import tensorflow as tf
    from tensorflow import keras

    np.random.seed(1)
    tf.random.set_seed(1)

    num_images = 200
    num_cat_breeds = 10
    num_dog_breeds = 15

    X_train = np.random.random([num_images, 32, 32, 3])
    y_breed = np.random.randint(num_cat_breeds + num_dog_breeds, size=num_images)
    y_is_cat = y_breed < num_cat_breeds
    y_cat_breed = np.where(y_is_cat, y_breed, -1)
    y_dog_breed = np.where(y_is_cat, -1, y_breed - num_cat_breeds)

    base_model = keras.Sequential([
    keras.layers.Conv2D(filters=32, kernel_size=3, activation="relu"),
    keras.layers.Flatten(),
    ])

    model_is_cat = keras.Sequential([
    keras.layers.Dense(1, activation="sigmoid")
    ])

    model_cat_breed = keras.Sequential([
    keras.layers.Dense(num_cat_breeds, activation="softmax")
    ])

    model_dog_breed = keras.Sequential([
    keras.layers.Dense(num_dog_breeds, activation="softmax")
    ])

    image_input = keras.layers.Input(shape=[32, 32, 3])
    z = base_model(image_input)
    is_cat = model_is_cat(z)
    cat_breed = model_cat_breed(z)
    dog_breed = model_dog_breed(z)
    model = keras.Model(inputs=[image_input],
    outputs=[is_cat, cat_breed, dog_breed])

    def optional_crossentropy(y_true, y_pred):
    is_not_ignored = y_true != -1
    y_true_no_ignore = tf.where(is_not_ignored, y_true, 0)
    mask = tf.cast(is_not_ignored, tf.float32)
    return keras.losses.sparse_categorical_crossentropy(y_true_no_ignore, y_pred) * mask

    model.compile(loss=["binary_crossentropy",
    optional_crossentropy,
    optional_crossentropy],
    optimizer="adam")
    model.fit(X_train, [y_is_cat, y_cat_breed, y_dog_breed], epochs=2)

    y_is_cat_pred, y_cat_breed_pred, y_dog_breed_pred = model.predict(X_train[:2])
    print(y_is_cat_pred)
    print(y_cat_breed_pred)
    print(y_dog_breed_pred)

    关于python - Keras条件传递一个模型输出到另一个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57852043/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com