Python 当改变神经元数量时,低精度的神经网络分类器不会得到改善
我制作了一个神经网络来识别物体,我用7类图像训练了这个模型。当我训练这个模型时,我总是得到0.217的精度。即使我改变了每层神经元的计数,我仍然得到了0.217的准确度 (我使用OpenCV将图像转换为数组,并使用pickle存储数据集) “创建数据集”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
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谢谢。。!!!我会试试的