tensorflow.keras.model.fit() 如何隐式知道将 int 值与概率分布相关联?

问题描述 投票:0回答:1

我正在学习张量流并遵循麻省理工学院 2023 年深度学习入门课程,我在第二个实验室中遇到了一些在我看来太方便的东西。该实验室旨在构建一个卷积神经网络来识别 MNIST 数据库中的手写数字。训练标签是整数值的一维张量,所有值都是 0-9。但模型本身输出给定数字正确概率的张量。

模型定义为:

    def build_cnn_model():
        cnn_model = tf.keras.Sequential([
            #Use parameters as shown in the diagram
            #First two params of Conv2D are filter shape
            tf.keras.layers.Conv2D(3,3, input_shape=(28, 28, 1), activation='relu'),
        
            tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(1,1)),
        
            tf.keras.layers.Conv2D(3,3, input_shape=(26, 26, 24)),
            tf.keras.layers.MaxPool2D(pool_size=(2,2), strides=(1,1)),
        
            tf.keras.layers.Flatten(),
            tf.keras.layers.Dense(128, activation='relu'),
        
            tf.keras.layers.Dense(10, activation='softmax')
        ])
        return cnn_model

    cnn = build_cnn_model()

然后编译:

    cnn.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=1e-1),
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

然后我将 fit 称为:

    cnn.fit(train_images, train_labels, batch_size=BATCH_SIZE, epochs=EPOCHS)

我的想法是,这就是我们使用

sparse_categorical_crossentropy
作为损失函数的原因,因为它不使用 1-hot 编码,而且我在文档中看到了一些关于它如何实现的内容(我没有完全理解)假设一个概率范围。 然而,这似乎是一个不完整的解释。如果我使用包含 20 个值而不是 10 个值的输出层定义模型会怎么样?或者我的培训标签词汇表是否有超过 10 个唯一值?这一切似乎有点方便,我想我错过了一些东西。概率范围和整数值之间的转换到底发生在哪里?

提前谢谢您!

tensorflow keras conv-neural-network mnist sparsecategoricalcrossentropy
1个回答
0
投票

实际上,什么都不需要转换。对于one-hot目标,交叉熵减少到

-log(p)
,其中
p
是正确类别的输出概率。

如果输出多于类(例如 20 个输出单元,但标签仅从 0-9),模型将简单地学习为“额外”类输出分配非常低的概率,因为它们永远不会正确。如果标签多于输出(例如 10 个输出单元,但标签从 0-19),则程序通常会崩溃,或者损失最终会为

NaN
,具体取决于实现。

© www.soinside.com 2019 - 2024. All rights reserved.