gpt4 book ai didi

python - 图像分类任务的损失为 NaN

转载 作者:行者123 更新时间:2023-11-28 18:56:58 25 4
gpt4 key购买 nike

我正在尝试在图像数据集上训练一个基本的 CNN,该图像数据集包含名人的面孔,并分配了与每个人相对应的类别。鉴于大约有 10,000 个类,我使用了 sparse_categorical_crossentropy 而不是对类进行单热编码,但是一旦网络开始训练,损失就停留在一个数字上,并且在几批处理变为 NaN 之后,我尝试了不同的图像缩放比例和一个较小的网络,但没有运气。关于可能导致 NaN 的原因的任何线索?

生成批处理的函数:

def Generator(data, label, batch_size):
url = "../input/celeba-dataset/img_align_celeba/img_align_celeba/"
INPUT_SHAPE = (109, 109)
i = 0
while True:
image_batch = [ ]
label_batch = [ ]
for b in range(batch_size):
if i == len(data):
i = 0
data, label = shuffle(data, label)
sample = data[i]
label_batch.append(label[i])
i += 1
image = cv2.resize(cv2.imread(url + sample), INPUT_SHAPE)
image_batch.append((image.astype(float)) / 255)

yield (np.array(image_batch), np.array(label_batch))

模型:

class CNN():

def __init__(self, train, val, y_train, y_val, batch_size):
## Load the batch generator
self.train_batch_gen = Generator(train, y_train, batch_size)
self.val_batch_gen = Generator(val, y_val, batch_size)

self.input_shape = (109, 109, 3)
self.num_classes = len(np.unique(y_train))
self.len_train = len(train)
self.len_val = len(val)

self.batch_size = batch_size
self.model = self.buildModel()

def buildModel(self):

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding="same", input_shape=self.input_shape))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding="same", input_shape=self.input_shape))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding="same"))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding="same"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(96, (3, 3), activation='relu', padding="same"))
model.add(layers.Conv2D(192, (3, 3), activation='relu', padding="same"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding="same"))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding="same"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(160, (3, 3), activation='relu', padding="same"))
model.add(layers.Conv2D(320, (3, 3), activation='relu', padding="same"))
model.add(layers.AveragePooling2D(pool_size=(4, 4)))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='tanh'))
model.add(layers.Dropout(rate=0.1))
model.add(layers.Dense(self.num_classes, activation = "softmax")) #Classification layer or output layer
opt = tf.keras.optimizers.Adam(learning_rate=0.00001)
model.compile(optimizer=opt, loss='sparse_categorical_crossentropy', metrics=['accuracy'])

return model

def trainModel(self, epochs):

self.model.fit_generator(generator=self.train_batch_gen,
steps_per_epoch = int(self.len_train // self.batch_size),
epochs=epochs,
validation_data = self.val_batch_gen,
validation_steps = int(self.len_val // self.batch_size))

最佳答案

在我的例子中,我使用了 sparse_categorical_crossentropy 和从 [1,2,3] 编号的标签(3 类)。在这种情况下,它从一开始就产生了 NaN。

当我将标签从 [1,2,3] 更改为 [0,1,2] 时,问题就消失了。

关于python - 图像分类任务的损失为 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57182449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com