【问题标题】:Validation Loss and Validation Accuracy do not change during training验证损失和验证准确度在训练期间不会改变
【发布时间】:2021-01-01 20:41:41
【问题描述】:

我用Tensorflow写了一个人脸分类器程序。在这个项目中,首先我只有两张脸,所以我使用binary_crossentropy 作为损失函数。当我决定添加更多面孔时,我从binary_crossentropy 切换到categorical_crossentropy

我的代码:

import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D


import pickle

pickle_in = open("/content/gdrive/My Drive/Deep Learning/Yüz Tanıma/X.pickle","rb")
X = pickle.load(pickle_in)

pickle_in = open("/content/gdrive/My Drive/Deep Learning/Yüz Tanıma/y.pickle","rb")
y = pickle.load(pickle_in)

X = X/255.0

model = Sequential()

model.add(Conv2D(128, (4, 4), input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (4, 4)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Dense(128))
model.add(Activation('relu'))

model.add(Dense(128))
model.add(Activation('relu'))


model.add(Flatten())  

model.add(Dropout(0.4))

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

model.fit(X, y, batch_size=32, epochs=20,validation_split=0.3)

model.save("/content/gdrive/My Drive/Deep Learning/Yüz Tanıma/model.h5")

这是我的训练日志:

Epoch 1/20
1728/1728 [==============================] - 30s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4833 - val_loss: 0.0000e+00 - val_accuracy: 0.4826
Epoch 2/20
1728/1728 [==============================] - 22s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4847 - val_loss: 0.0000e+00 - val_accuracy: 0.4826
Epoch 3/20
1728/1728 [==============================] - 22s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4827 - val_loss: 0.0000e+00 - val_accuracy: 0.4826

如您所见,我的val_lossval_accuracy 没有改变。我的代码有什么问题,我该如何解决?

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    如果提供有关数据的更多信息,答案会更准确。

    首先,您使用分类交叉熵作为损失函数,使用 Sigmoid 作为最后一层的激活,这有点矛盾(sigmoid 意味着您在 2 个类别和分类交叉熵中进行分类是当你有超过 2 个类时使用的东西)。如果您想使用 sigmoid(这意味着您有 2 个类)将您的损失更改为 Binary Cross-entropy,或者如果您愿意,您应该将您的 sigmoid 更改为 softmax 函数在 2 个以上的类别中进行分类。

    此外,您必须在最后一个 CNN 层之后和第一个密集层之前使用 flatten(它将特征图(矩阵)转换为向量,这是正确的输入形状密集层。

    最后,在完成所有这些之后,您可以使用超参数(学习率、batch_size 等)来查看是否可以获得一些准确度提升。

    【讨论】:

    • 感谢您的回答。我将激活函数更改为 softmax,但它给出了相同的输出
    • 那么我想需要更多信息来确保你做的每件事都是正确的,比如数据是什么样的,你使用了多少数据进行训练,每个数据的比例是多少上课之类的……
    • 我正在将照片转换为 numpy 数组,在随机转储到 X.pickle 后调整为 50,50,并且每个类(面)在 Y 泡菜中的 ID 号为 0,1,2索引号作为照片 X.pickle 中的索引号。 2张脸有12k张照片,但第三类有1k张照片。
    • 那么数据对我来说似乎没问题(至少现在是这样),你有没有对你的标签进行热编码?据我所知,TensorFlow 期望标签是一次性编码的,你可以使用这样的东西 - y = tf.keras.utils.to_categorical(y)。另一件事是您能否使您的 input_shape 参数值更明确,例如 - input_shape = (X.shape[1], X.shape[2], 3),此处末尾的“3”表示 3 个通道(我猜您的图像是 RGB)。
    • 我都试过了。 y = tf.keras.utils.to_categorical(y) 返回大量错误。输入形状方法的结果与相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2020-12-03
    相关资源
    最近更新 更多