首页 > 解决方案 > 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 开始,然后按我的意愿下降。但我不确定如何处理准确性。

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

标签: pythontensorflowdeep-learningneural-networkconv-neural-network

解决方案


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

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

你需要使用CategoricalCrossentropy. 从文档

当有两个或多个标签类时使用此交叉熵损失函数。我们希望以 one_hot 表示形式提供标签。如果您想以整数形式提供标签,请使用 SparseCategoricalCrossentropy 损失。每个特征应该有 # 个类浮点值。


推荐阅读