Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当改变神经元数量时,低精度的神经网络分类器不会得到改善_Python_Tensorflow_Keras_Neural Network - Fatal编程技术网

Python 当改变神经元数量时,低精度的神经网络分类器不会得到改善

Python 当改变神经元数量时,低精度的神经网络分类器不会得到改善,python,tensorflow,keras,neural-network,Python,Tensorflow,Keras,Neural Network,我制作了一个神经网络来识别物体,我用7类图像训练了这个模型。当我训练这个模型时,我总是得到0.217的精度。即使我改变了每层神经元的计数,我仍然得到了0.217的准确度 (我使用OpenCV将图像转换为数组,并使用pickle存储数据集) “创建数据集” import numpy as np import os import cv2 import pickle import random datadir = r"C:\Users\pc\Desktop\Tenserflow\upg

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

(我使用OpenCV将图像转换为数组,并使用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)

我在您的代码中看到两个问题:

1:你用
categorical\u crossentropy
作为你的损失。此丢失假设目标的格式为
[1,0,0,0,0,0,0]
[0,1,0,0,0,0]
[0,0,1,0,0,0,0]
等,但您创建的数据集似乎有
[0]
[1]
[2]
等目标

您需要切换到
sparse\u categorical\u crossentropy
loss and single output功能,或者为您的目标使用
to\u categorical
功能。我建议您使用
to_category
功能,这样您就不需要更改网络

更多关于这些的信息:


2:你的网络太简单了,不能给你一个好的准确度。您在
Conv2D
中使用的过滤器太少。例如,尝试使用16、32和32过滤器。另外,您的
密集
层太小。第一个密集层尝试使用128,第二个密集层尝试使用7。

您的数据是否平衡,或者您是否可以发布数据大小,例如每个类的样本数量使用ImageDataGenerator处理图像并进行增强。我认为网络不是因为简单的架构而训练的,对conv层使用更大的通道,比如(32或16)和(256512)密集层。我用了大约28000张图片,数据集超过200MB谢谢。。!!!我会试试的