【问题标题】:Transfer learning with Keras and CNN: Received a label value of 46 which is outside the valid range of [0, 5)使用 Keras 和 CNN 进行迁移学习:收到的标签值为 46,超出 [0, 5) 的有效范围
【发布时间】:2021-04-28 00:38:28
【问题描述】:

我已经用一个包含 43 个类的数据集训练了一个序列模型;每个类名都是 0 - 43,它们是从目录名派生的。现在我想使用迁移学习在先前训练的模型之上创建一个新模型,新数据的类别为 43 - 47。现在的问题是当我添加 5(我的标签计数 43-47)作为密集层中的类数显示此错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError:收到的标签值为 46,超出了 [0, 5) 的有效范围。

那么如何在 Dense 层中添加从 44 开始的类数,而不是零 (0)?

这是我的传输模型代码:

model_old = load_model('model.h5')

model_new = tf.keras.models.Sequential()

for layer in model_old.layers[:-1]:
    layer.trainable = False
    model_new.add(layer)

model_new.add(tf.keras.layers.Dense(5, activation="softmax"))
model_new.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) 

【问题讨论】:

    标签: python tensorflow machine-learning keras transfer-learning


    【解决方案1】:

    请检查您是否调用了 tf.keras.utils.to_categorical(y, num_classes=None, dtype='float32') 函数,它将 Y 向量包含标签 (43-47) 转换为从 0 到整数的矩阵num_classes = 5 在你的情况下(0,1,2,3,4)。 希望这会有所帮助。

    【讨论】:

    • 您好@wmsr,感谢您的贡献,但这样做的值将与第一个数据集矩阵整数重叠,这些整数是(0,1,2,3,4)类的 0 - 4。这个也将是 (0,1,2,3,4) 我不希望它是这样的,因为我有一个包含所有标签的字典,例如:1: 'Speed limit (20km/h)', 2: 'Speed limit (30km/h)', 3: 'Speed limit (50km/h)', 4: 'Speed limit (60km/h)', 5: 'Speed limit (70km/h)', 6: 'Speed limit (80km/h)', 我想要 43 的不同名称, 44、45、46、47类
    • 嗨@sadaf,您的new_model 的5 个输出类与您的old_model 的43 个输出类完全不同。即:当您使用 new_model 执行预测时,您将获得一个 y_pred 向量,其中包含属于 (43-47) 类之一的概率。另一方面,如果您需要对 43 个第一类进行预测,您可能会使用 old_model 来执行它。所以对于 new_model 标签是 {'43':0, '44':1, ... , '46':4},对于 old_model 标签是 {'0':0, '1':1, . .., '42':42}.
    • 嗨@wmsr 非常感谢!解决了。 :)
    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 2021-06-08
    • 1970-01-01
    • 2020-04-03
    • 2019-02-18
    • 2019-03-08
    • 2018-02-10
    • 2019-11-22
    相关资源
    最近更新 更多