簡體   English   中英

CNN 的准確率非常低

[英]Very low accuracy on CNN

我正在學習神經網絡並嘗試從頭開始構建我自己的 CNN model。 目前我正在研究包含 20000 張圖片的斯坦福狗數據集。 我已經構建了 model 並且成本已經很低。 但是准確率很低,雖然我不明白原因。

在這里我做數據增強:

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 上運行它。

您的 model 中有多個不一致之處。

  1. model.add(Dense(120,activation="softmax")) - 這行表明你有 120 個類,120 個類很多,120 個類的預期隨機准確度 = 0.83 %你需要每個 ZA2F2ED4F8EBC2CBB4C21A29DC40AB16 的大量樣本

您很可能需要更好的 model。 此外,您需要顯示每個時期的損失和指標以獲得更好的想法。

  1. 如果我們使用softmax進行多類分類,首選損失function是categorical_crossentropy

您的代碼沒有使用正確的損失 function,因為最終分類是多類的(數據集的注釋中有兩種以上的狗)。 keras 文檔state 以下關於BinaryCrossentropy

當只有兩個 label 類(假設為 0 和 1)時使用此交叉熵損失。 對於每個示例,每個預測都應該有一個浮點值。

您需要使用CategoricalCrossentropy 文檔

當有兩個或更多 label 類時,使用此交叉熵損失 function。 我們希望以 one_hot 表示形式提供標簽。 如果您想以整數形式提供標簽,請使用 SparseCategoricalCrossentropy 損失。 每個特征應該有 # 個類浮點值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM