我有一个使用Tensorflow进行图像分类的深度神经网络(DNN),它使用二元交叉熵作为损失函数,并在tf.keras.preprocessing.image_dataset_from_directory调用中使用对应的标签模式“binary”。当我训练模型并对图像进行推理时,预测输出类似于[[-3.5601902]]或[[2.1026382]]。我该如何解释这些输出,以确定模型将图像分配到哪个类别?我认为答案可能是实现一个softmax函数,但我的尝试没有成功。
对tf.keras.preprocessing.image_dataset的调用:
train_ds = tf.keras.preprocessing.image_dataset_from_directory(images_directory,label_mode="binary",validation_split=0.2,subset="training",seed=123,image_size=(img_height, img_width),batch_size=batch_size)val_ds = tf.keras.preprocessing.image_dataset_from_directory(images_directory,label_mode="binary",validation_split=0.2,subset="validation",seed=123,image_size=(img_height, img_width),batch_size=batch_size)
以及模型
model = Sequential([layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),layers.Conv2D(16, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Conv2D(32, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Conv2D(64, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Flatten(),layers.Dense(128, activation='relu'),layers.Dense(num_classes)])model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])
也欢迎对模型提出任何建议。
回答:
你试图实现的目标有点令人困惑。
如果你在进行二元分类(我认为你是在做这个),那么你的输出层的尺寸不应该是‘num_classes’,而应该是1,并且使用sigmoid作为激活函数。如果你这样做了,输出‘p’将是类别1的概率,而1-‘p’则是类别0的概率。看起来你将多类别分类的方法和二元分类混在了一起。
我能说的唯一一点是,这些值是logit输出。