gpt4 book ai didi

python - 如何提高神经网络的准确性

转载 作者:行者123 更新时间:2023-11-30 09:26:07 25 4
gpt4 key购买 nike

我正在尝试构建一个简单的神经网络来将产品图像分类为不同的标签(产品类型)。即,给定一个新产品图像,告诉它属于哪个产品类别类型(书籍、玩具、电子产品等)。

每个产品编号下都有几个产品图像,每个产品编号在 Excel 工作表中都有一个标签(即产品类型)。

下面是我的代码:

from sklearn.preprocessing import LabelEncoder
from sklearn.cross_validation import train_test_split
from keras.models import Sequential
from keras.layers import Activation
from keras.optimizers import SGD
from keras.layers import Dense
from keras.utils import np_utils
from imutils import paths
import numpy as np
import argparse
import cv2
import os
import xlwt
import xlrd
import glob2
import pickle

def image_to_feature_vector(image, size=(32,32)):
return cv2.resize(image, size).flatten()

def read_data(xls = "/Desktop/num_to_product_type.xlsx"):
book = xlrd.open_workbook(xls)
sheet = book.sheet_by_index(0)
d = {}
for row_index in xrange(1, sheet.nrows): # skip heading row
prod_type, prod_num = sheet.row_values(row_index, end_colx=2)
prod_type = unicode(prod_type).encode('UTF8')
produ_num = unicode(prod_num).encode('UTF8')

d[prod_num] = prod_type
return d

def main():

try:
imagePaths=[]
print("[INFO] describing images...")
for path, subdirs, files in os.walk(r'/Desktop/data'):
for filename in files:
imagePaths.append(os.path.join(path, filename))

files = glob2.glob('/Desktop/data/**/.DS_Store')
for i in files:
imagePaths.remove(i)
except:
pass

dd = read_data()
# initialize the data matrix and labels list
data = []
labels1 = []

for (i, imagePath) in enumerate(imagePaths):
image = cv2.imread(imagePath)
#print(image.shape)
subdir = imagePath.split('/')[-2]
for k, v in dd.items():
if k == subdir:
label = v
break

features = image_to_feature_vector(image)
data.append(features)
labels1.append(label)


# show an update every 1,000 images
if i > 0 and i % 1000 == 0:
print("[INFO] processed {}/{}".format(i, len(imagePaths)))
print("String Labels")
print(labels1)

# encode the labels, converting them from strings to integers
le = LabelEncoder()
labels = le.fit_transform(labels1)
print(labels)

d={}
d[labels[0]] = labels1[0]

for i in range(1,len(labels)-1):
if labels[i-1] != labels[i] and labels[i] == labels[i+1]:
d[labels[i]] = labels1[i]

data = np.array(data) / 255.0
labels = np_utils.to_categorical(labels, 51)
print("To_Categorical")
print(labels)

print("[INFO] constructing training/testing split...")
(trainData, testData, trainLabels, testLabels) = train_test_split(
data, labels, test_size=0.25, random_state=42)

model = Sequential()
model.add(Dense(768, input_dim=3072, init="uniform",
activation="relu"))
model.add(Dense(384, init="uniform", activation="relu"))
model.add(Dense(51))
model.add(Activation("softmax"))

print("[INFO] compiling model...")

sgd = SGD(lr=0.125
)
model.compile(loss="categorical_crossentropy", optimizer=sgd,
metrics=["accuracy"])
model.fit(trainData, trainLabels, nb_epoch=50, batch_size=750)


# #Test the model
#show the accuracy on the testing set
print("[INFO] evaluating on testing set...")
(loss, accuracy) = model.evaluate(testData, testLabels,
batch_size=128, verbose=1)
print("[INFO] loss={:.4f}, accuracy: {:.4f}%".format(loss,
accuracy * 100))

if __name__ == '__main__':

main()

神经网络是一个 3-2-3-51 前馈神经网络。第 0 层包含 3 个输入。第 1 层和第 2 层是分别包含 2 个和 3 个节点的隐藏层。第 3 层是输出层,有 51 个节点(即 51 个产品类别类型)。然而,这样我得到的准确率非常低,只有大约 45-50%。

我做错了什么吗?如何提高神经网络的准确性?我在某处读到它可以通过“交叉验证和超参数调整”来完成,但它是如何完成的?抱歉,我对神经网络很陌生,只是尝试一些新东西。谢谢。

最佳答案

超参数验证

您为什么选择 3-2-3-2 ANN 而不是 3-6-23-4-4-4-4-2

通常我们不知道要达到 80% 的准确度或任何让我们高兴的东西所需的确切拓扑(层数、每层神经元数量、神经元之间的连接)。这就是超参数训练发挥作用的地方。有了它,我们告诉我们的程序尝试几种不同的拓扑,直到找到一种对我们来说足够好的拓扑。

你如何告诉你的程序要尝试哪些拓扑?我们使用另一个人工神经网络或进化算法来做到这一点,它生成伪随机拓扑,评估每个拓扑,并为每个拓扑给出分数,然后组合具有较高分数的拓扑,好吧,你知道它是如何工作的。 p>

这样做肯定会帮助您提高总体分数(前提是您的问题有一个好的解决方案)

交叉验证

你如何知道你的算法要进行多少次迭代?您的停止标准是什么?

人工神经网络有一个反复出现的问题,称为内存。如果您运行学习算法 100 万次迭代,通常会比仅运行 10 次迭代获得更好的分数,但这可能是由于对训练集的内存所致:您的人工神经网络仅学习预测这些训练的结果集,但在尝试预测以前从未见过的数据时表现不佳。

解决该问题的一种方法是交叉验证,这意味着您将数据分为 2 组:trainvalidation 。然后,您使用 train 训练您的 ANN设置您想要的任意数量的迭代,但同时,您将使用 validation 测试您的 ANN设置知道何时停止。如果 10 次迭代后你的 train准确性不断提高,但是您的validation准确性持续下降,那么您可以确定您的 ANN 正在内存,因此您将停止学习算法并选择 10 次迭代前的 ANN。

当然,10只是一个例子,你可以尝试使用不同的值,甚至将其放入你的超参数训练中,你不需要对值进行硬编码。

我建议你看看这个course in Coursera的 Material 他们非常清楚地解释了这些概念。

(顺便说一句:通常您将输入集分为 3 个: trainvalidatetest 。其中 test 用于查看您的 ANN 对完全不可见的数据的行为,您不使用test 设置为在训练中做出任何决定)

关于python - 如何提高神经网络的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45473426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com