首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在神经网络的最后一层,我应该有多少个节点来进行二值分类?

在神经网络的最后一层,我应该有多少个节点来进行二值分类?
EN

Stack Overflow用户
提问于 2022-05-23 16:46:09
回答 1查看 120关注 0票数 0

我认为,如果我有一个binary-classification问题,那么我应该总是只有一个节点在最后一层,因为最后一层必须决定分类。但是,在下面的代码中,这不是真的。

让我们下载披萨/牛排数据集(图像数据集),并使用ImageDataGenerator准备数据

代码语言:javascript
复制
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)

然后构建、编译一个神经网络,并在其上拟合数据:

代码语言:javascript
复制
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模型时,在最后一层应该有多少个节点?

EN

回答 1

Stack Overflow用户

发布于 2022-05-26 08:54:54

多亏了@Dr.Snoopy,我在这里添加了一个答案来完成这个问题。

重点是如何使用image_data_generator.flow_from_directory()对数据进行标记。

如果我们设置class_mode='categorical',那么目标是ONE_HOT,最后一层的节点数等于“目标特性类的数”。在我的例子中,它是一个二进制特性,所以我需要在最后一层有两个节点。

但是,如果我们使用class_mode='binary',那么目标将被索引,并且我们只能在最后一层中有一个节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72352092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档