CNN的准确性非常低



我正在学习神经网络,并尝试从头开始构建自己的CNN模型。目前,我正在研究带有20000张图片的斯坦福狗数据集。我已经建立了一个模型,并且成本已经很低了。但是准确性很低,但我无法理解原因。

在这里,我进行数据增强:

import os
import time
import zipfile
import pandas as pd
import tensorflow as tf
from tensorflow import keras # Tensorflow high-level api
from tensorflow.keras import layers
from keras import optimizers
from keras.models import Model, Sequential
from keras.layers import Dense,Flatten, GlobalAveragePooling2D, BatchNormalization, Activation, Dropout, Conv2D,MaxPooling2D
from keras.callbacks import ModelCheckpoint, EarlyStopping, TensorBoard, CSVLogger, ReduceLROnPlateau
#from keras.layers import Activation, Dropout, Flatten, Dense
from keras.applications.xception import Xception
from keras.preprocessing.image import ImageDataGenerator
!pip install kaggle
from google.colab import files
files.upload()
#before importing the dataset we want to use this code
# The Kaggle API client expects this file to be in ~/.kaggle,
!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/
# This permissions change avoids a warning on Kaggle tool startup.
!chmod 600 ~/.kaggle/kaggle.json
!kaggle datasets download -d jessicali9530/stanford-dogs-dataset
local_zip = '/content/stanford-dogs-dataset.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/content/stanford-dogs')
zip_ref.close()

train_data_dir = os.path.join("/content", "stanford-dogs", "images", "Images")
img_width, img_height = 128, 128
batch_size = 32
train_datagen = ImageDataGenerator(
rescale=1./255,             
vertical_flip = True,
horizontal_flip = True,
rotation_range=20,
shear_range=0.05,           
zoom_range=0.2,   
width_shift_range=0.1,
height_shift_range=0.1,
validation_split=0.15
channel_shift_range=0.1
)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical',    # 2D one-hot encoded labels (batch_size x 101)
subset='training')

validation_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical',    # 2D one-hot encoded labels (batch_size x 101)
subset='validation')
model.add(Conv2D(kernel_size=(3,3),filters=32,input_shape = (img_width, img_height, 3),activation="relu",padding="valid"))
model.add(Conv2D(kernel_size=(3,3),filters=32,activation="relu",padding="same"))
model.add(Dropout(0.15))
model.add(Conv2D(kernel_size=(3,3),filters=24))
model.add(Conv2D(kernel_size=(3,3),filters=64,activation="relu",padding="same"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(kernel_size=(3,3),filters=24))
model.add(Dropout(0.25))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(kernel_size=(5,5),filters=32,activation="relu",padding="same"))
model.add(MaxPooling2D(pool_size=(3,3)))

model.add(Flatten())
model.add(Dense(100,activation="relu",kernel_regularizer=keras.regularizers.l2(0.01)))
model.add(Dropout(0.4))
model.add(Dense(120,activation="softmax"))

model.summary()
model.compile(loss=keras.losses.binary_crossentropy,
optimizer=keras.optimizers.Adadelta(lr=0.01),
metrics=['accuracy'])
history = model.fit_generator(train_generator,
steps_per_epoch = train_generator.n // train_generator.batch_size,
validation_data = validation_generator,
validation_steps = validation_generator.n // validation_generator.batch_size,
epochs = 10,
shuffle= True,         
verbose = 1)

成本处于预期水平,它从 1.9 开始,然后像我想要的那样下降。但我不确定如何处理准确性。

编辑:我编辑了代码,我目前正在谷歌Colab上运行它。

模型中存在多个不一致之处。

  1. model.add(Dense(120,activation="softmax"))- 这条线假设你有 120 个类,120 个类很多,120 个类的预期随机精度 =0.83 %每个类需要大量的样本。

您很可能需要一个更好的模型。此外,您需要显示每个纪元的损失和指标以获得更好的想法。

  1. 如果我们使用softmax进行多类分类,则首选损失函数为categorical_crossentropy

您的代码没有使用正确的损失函数,因为最终分类是多类的(数据集的注释中有两种以上的狗(。keras 文档对BinaryCrossentropy有以下说明:

当只有两个标注分类(假设为 0 和 1(时,使用此交叉熵损失。对于每个示例,每个预测应该有一个浮点值。

您需要使用CategoricalCrossentropy.从文档中:

当存在两个或多个标注分类时,使用此交叉熵损失函数。我们希望以one_hot表示形式提供标签。如果要提供整数标签,请使用稀疏分类交叉熵损失。每个要素应有 # 类浮点值。

最新更新