首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CNN的准确率很低

CNN的准确率很低
EN

Stack Overflow用户
提问于 2020-06-21 20:48:34
回答 2查看 1.4K关注 0票数 0

我正在学习神经网络,并试图从零开始建立自己的CNN模型。目前,我正在研究斯坦福狗数据集和20000张照片。我已经做了一个模型,而且成本已经很低了。但准确度很低,虽然我不明白原因。

在这里,我做数据增强:

代码语言:javascript
复制
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')
代码语言:javascript
复制
 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上。

EN

回答 2

Stack Overflow用户

发布于 2020-06-21 21:12:05

您的模型中有多个不一致之处。

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

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

  1. 如果我们使用softmax进行多类分类,则首选的损失函数是categorical_crossentropy
票数 0
EN

Stack Overflow用户

发布于 2020-06-22 07:47:50

您的代码没有使用正确的丢失函数,因为最终的分类是多类的(数据集的注释中有两种以上类型的狗)。角蛋白文档声明了关于BinaryCrossentropy的以下内容

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

您需要使用CategoricalCrossentropy。来自医生们

当有两个或多个标签类时,使用这个交叉熵损失函数。我们期望在one_hot表示中提供标签。如果要以整数形式提供标签,请使用SparseCategoricalCrossentropy丢失。每个特性都应该有#类浮点值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62504265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档