【问题标题】:Neural Network classifier with low accuracy does not improve when changing neuron count更改神经元计数时,精度低的神经网络分类器没有改善
【发布时间】:2021-01-03 23:25:02
【问题描述】:

我制作了一个神经网络来识别物体,我使用 7 类图像训练了这个模型。当我训练这个模型时,我总是得到 0.217 的准确率。即使我改变了每一层的每个神经元的数量,我仍然得到 0.217 的准确度

categories of training image data (我用open cv把图片转成数组,用pickle存储数据集)

'创建数据集'

import numpy as np
import os
import cv2
import pickle
import random


datadir = r"C:\Users\pc\Desktop\Tenserflow\upgrade1\Images"

categories = []
for root, dirs, files in os.walk(datadir, topdown=False):
    for name in dirs:
        categories.append(name)


training_data = []
img_size = 100

def create_training_data():
    for category in categories:
        path = os.path.join(datadir, category)
        class_num = categories.index(category)

        for img in os.listdir(path):
            try:
                img_array = cv2.imread(os.path.join(path, img),cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (img_size, img_size))
                training_data.append([new_array,class_num])
           
            except Exception as e:
                pass

create_training_data()
random.shuffle(training_data)


x =[]
y =[]

for features ,label in training_data:
    x.append(features)
    y.append(label)

x = np.array(x).reshape(-1,  img_size, img_size, 1)
y = np.array(y)


file1 = open('x.pickle', 'wb')
file2 = open('y.pickle', 'wb')


pickle.dump(x, file1)
pickle.dump(y, file2)

file1.close()
file2.close()

'训练代码'

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Activation, Conv2D, MaxPooling2D
import pickle
import numpy as np

x =pickle.load(open("x.pickle", "rb"))
y =pickle.load(open("y.pickle", "rb"))

x = x/255.0

model = Sequential()
model.add(Conv2D(3,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(7,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(7,(3,3)))

model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())

model.add(Dense(5))
model.add(Activation("relu"))

model.add(Dense(7))
model.add(Activation('softmax'))

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])
model.fit(x, y, epochs = 2, validation_split = 0.1)

【问题讨论】:

  • 您的数据是否平衡,或者您可以发布您的数据大小,例如每个类的样本数量
  • 使用 ImageDataGenerator 处理图像和增强。我认为网络没有训练是因为简单的架构,使用更大的通道用于卷积层,如(32 或 16)和(256,512)用于密集。 keras.io/api/preprocessing/image
  • 我使用了大约 28000 张图片,数据集超过 200mb
  • 谢谢..!!!我会试试的

标签: python tensorflow keras neural-network


【解决方案1】:

我在您的代码中发现了两个问题:

1:您使用categorical_crossentropy 作为您的损失。这种损失假设目标格式为[1,0,0,0,0,0,0][0,1,0,0,0,0,0][0,0,1,0,0,0,0] 等,但您的数据集创建似乎具有[0][1][2] 等格式的目标。

您需要切换到sparse_categorical_crossentropy 损失和单输出功能,或者为您的目标使用to_categorical 功能。我建议使用to_categorical 函数,这样您就无需更改网络。

更多信息:

https://www.tensorflow.org/api_docs/python/tf/keras/losses/SparseCategoricalCrossentropy

https://www.tensorflow.org/api_docs/python/tf/keras/utils/to_categorical

2:您的网络过于简单,无法提供良好的准确性。你在Conv2D 中使用的过滤器太少了。例如,尝试使用 16、32 和 32 过滤器。你的Dense 层也太小了。尝试将 128 用于第一个密集层,将 7 用于第二个密集层。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2018-06-15
    • 2018-07-06
    • 1970-01-01
    • 2023-03-29
    • 2016-10-19
    • 1970-01-01
    • 2018-07-07
    • 2020-04-04
    相关资源
    最近更新 更多