我认为,如果我有一个binary-classification问题,那么我应该总是只有一个节点在最后一层,因为最后一层必须决定分类。但是,在下面的代码中,这不是真的。
让我们下载披萨/牛排数据集(图像数据集),并使用ImageDataGenerator准备数据
import zipfile
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Dropout, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image_dataset_from_directory
from tensorflow.keras.applications import EfficientNetB0, resnet50
from tensorflow.keras.models import Sequential
import numpy as np
import pandas as pd
!wget https://storage.googleapis.com/ztm_tf_course/food_vision/pizza_steak.zip
zip_ref = zipfile.ZipFile("pizza_steak.zip", "r")
zip_ref.extractall()
zip_ref.close()
train_directory = './pizza_steak/train/'
test_directory = './pizza_steak/test/'
IMAGE_SIZE = (224, 224)
image_data_generator = ImageDataGenerator(rescale=1. / 255,
zoom_range=0.2,
shear_range=0.2,
rotation_range=0.2)
train_dt = image_data_generator.flow_from_directory(directory=train_directory,
class_mode='categorical',
batch_size=32,
target_size=IMAGE_SIZE)
test_dt = image_data_generator.flow_from_directory(directory=test_directory,
class_mode='categorical',
batch_size=32,
target_size=IMAGE_SIZE)然后构建、编译一个神经网络,并在其上拟合数据:
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=3, activation='relu'))
model.add(Conv2D(filters=16, kernel_size=3, activation='relu'))
model.add(MaxPooling2D())
model.add(Conv2D(filters=16, kernel_size=3, activation='relu'))
model.add(Conv2D(filters=16, kernel_size=3, activation='relu'))
model.add(MaxPooling2D())
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(train_dt,
epochs=5,
validation_data=test_dt,
validation_steps=len(test_dt)如您所见,val_accuracy并不比0.5000更好,这是非常糟糕的!
现在,如果您只是将最后一层更改为model.add(Dense(2, activation='sigmoid')),并运行相同的模型,在最后一层中有两个节点,您将得到一个更好的结果,比如val_accuracy: 0.8680。
如何知道,当我有一个binary-classification模型时,在最后一层应该有多少个节点?
发布于 2022-05-26 08:54:54
多亏了@Dr.Snoopy,我在这里添加了一个答案来完成这个问题。
重点是如何使用image_data_generator.flow_from_directory()对数据进行标记。
如果我们设置class_mode='categorical',那么目标是ONE_HOT,最后一层的节点数等于“目标特性类的数”。在我的例子中,它是一个二进制特性,所以我需要在最后一层有两个节点。
但是,如果我们使用class_mode='binary',那么目标将被索引,并且我们只能在最后一层中有一个节点。
https://stackoverflow.com/questions/72352092
复制相似问题