Je suis nouveau à MXNet et je veux résoudre un exemple simple qui utilise le réseau 1 couche pour résoudre le problème de classification des chiffres. Mon programme se déroule comme suit:Pourquoi MXNet signale une exactitude de validation incorrecte?
import math
import numpy as np
import mxnet as mx
import matplotlib.pyplot as plt
import logging
logging.getLogger().setLevel(logging.DEBUG)
#============================================================
with np.load("notMNIST.npz") as data:
images, labels = data["images"], data["labels"]
# Reshape the images from 28x28 into 784 1D-array and flaten the labels.
images = images.reshape(784, 18720) labels = labels.reshape(18720)
# Apply one-hot encoding.
Images = images.T.astype(np.float32)
Labels = np.zeros((18720, 10)).astype(np.float32)
Labels[np.arange(18720), labels] = 1
# Segment the data into training, evaluation and testing.
X_train = Images[0 : 15000]
y_train = Labels[0 : 15000]
X_eval = Images[15000 : 16000]
y_eval = Labels[ 1200 : 2200] # IMPORTANT!!!
X_test = Images[16000 : 18720]
y_test = Labels[16000 : 18720]
train_iter = mx.io.NDArrayIter(X_train, y_train, 100, shuffle=False)
_eval_iter = mx.io.NDArrayIter(X_eval , y_eval , 100, shuffle=False)
#============================================================
# Variables
X = mx.sym.Variable(name='data')
# Neural Network Layers
fully_connected_layer = mx.sym.FullyConnected(data=X, name='fc1', num_hidden=10)
# Outputs
lro = mx.sym.SoftmaxOutput(data=fully_connected_layer, name="softmax")
#============================================================
model = mx.mod.Module(symbol=lro)
model.fit(train_data=train_iter, eval_data=_eval_iter,
optimizer='sgd', optimizer_params={
'learning_rate' : 1e-5,
'momentum' : 0.1},
eval_metric="acc",
num_epoch=500)
Après l'exécution du programme avec l'étiquette d'évaluation 15000
à 16000
, l'étape finale signale une précision de validation des 97%
, que je soutiens personnellement est trop élevé pour un réseau 1-couche. Par conséquent, j'ai délibérément changé les étiquettes d'évaluation à 1200
à 2200
et j'ai vu que le programme rapporte toujours une précision autour de 83~86%
(au début je pensais que c'était peut-être juste une coïncidence et essayé plusieurs étiquettes d'évaluation différentes mais obtenaient des résultats similaires).
Quelles sont les erreurs que j'ai commises dans mon programme?