简体   繁体   English

验证损失和验证准确度在训练期间不会改变

[英]Validation Loss and Validation Accuracy do not change during training

I wrote a face classifier program with Tensorflow .我用Tensorflow编写了一个人脸分类器程序。 In this project, first I just had 2 faces so I used binary_crossentropy as loss function.在这个项目中,首先我只有两张脸,所以我使用binary_crossentropy作为损失 function。 When I decided to add more faces I switched from binary_crossentropy to categorical_crossentropy .当我决定添加更多面孔时,我从binary_crossentropy切换到categorical_crossentropy

My code:我的代码:

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")

And here is my training log:这是我的训练日志:

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

As you can see my val_loss and val_accuracy don't change.如您所见,我的val_lossval_accuracy没有改变。 What's wrong with my code and how can I fix that?我的代码有什么问题,我该如何解决?

The answer would've been more precise if more information about the data were given.如果提供有关数据的更多信息,答案会更准确。

For starters, you've used categorical cross-entropy as your loss function and Sigmoid as activation of the last layer, which is kind of contradictory ( sigmoid means you're classifying among 2 classes and categorical cross-entropy is something you use when you've got more than 2 classes ).对于初学者,您使用分类交叉熵作为损失 function 和 Sigmoid 作为最后一层的激活,这有点矛盾( sigmoid 意味着您在 2 个类别中进行分类,而分类交叉熵是您在有超过 2 节课)。 Either change your loss to Binary Cross-entropy if you want to use sigmoid (which means you've 2 classes) or you should change your sigmoid to softmax function if you want to classify among more than 2 classes.如果您想使用 sigmoid(这意味着您有 2 个类),请将您的损失更改为 Binary Cross-entropy或者如果您想在 2 个以上的类中分类,您应该将您的 sigmoid 更改为 softmax function

Also, you've to use flatten after the last CNN layer and before the first dense layer (it turns the feature map (a matrix) into a vector, which is the correct input shape for dense layers.此外,您必须在最后一个 CNN 层之后和第一个密集层之前使用 flatten (它将特征 map (矩阵)转换为向量,这是密集层的正确输入形状。

Lastly, after doing all those you can play around with your hyperparameters (learning rate, batch_size, etc.) to see if you can get some accuracy gain.最后,在完成所有这些之后,您可以使用超参数(学习率、batch_size 等)来查看是否可以获得一些准确度提升。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM