Estoy tratando de agregar una segunda capa oculta a mi red neuronal, entrenando en el conjunto de datos MNIST. Con solo una simple capa oculta, el entrenamiento funciona bien y la precisión aumenta constantemente.
Cuando trato de agregar la segunda capa, la precisión se bloquea en 0.117 cada vez que comienzo a entrenar. ¿No puedo entender qué estoy haciendo mal aquí?
Intenté agregar sigmoide a mi y sin suerte.
XTrain = XTrain[0:10000,:]
YTrain = YTrain[0:10000]
K = len(set(YTrain))
N = len(YTrain)
M = 12 #Hidden layer units
D = XTrain.shape[1]
tfX = tf.placeholder(tf.float32, [None, D])
tfY = tf.placeholder(tf.float32, [None, K])
# HIDDEN LAYER 1
W1 = tf.Variable(tf.random_normal([D,M], stddev=0.01))
b1 = tf.Variable(tf.random_normal([M], stddev=0.01))
# HIDDEN LAYER 2
W2 = tf.Variable(tf.random_normal([M,M], stddev=0.01))
b2 = tf.Variable(tf.random_normal([M], stddev=0.01))
# OUTPUT LAYER
W3 = tf.Variable(tf.random_normal([M,K], stddev=0.01))
b3 = tf.Variable(tf.random_normal([K], stddev=0.01))
# MODEL
h1 = tf.nn.sigmoid(tf.matmul(tfX, W1) + b1)
h2 = tf.nn.sigmoid(tf.matmul(h1, W2) + b2)
y = tf.matmul(h2,W3) + b3
# Softmax and cross-entropy
cost = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits_v2(
labels = tfY,
logits = y)
)
# Targets One-Hot encoded
T = np.zeros((N,K))
for i in range(N):
T[i,YTrain[i]] = 1
#Gradient descent
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)
predict_op = tf.argmax(y, 1)
# Start session and initialize variables
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
# TRAIN
for i in range(10000):
sess.run(train_op, feed_dict={tfX: XTrain, tfY: T})
pred = sess.run(predict_op, feed_dict={tfX: XTrain, tfY: T})
if i % 20 == 0:
print("Accuracy:", np.mean(YTrain == pred))
Cuando empiezo a entrenar, la salida se ve así:
Exactitud: 0.0991 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127 Exactitud: 0.1127
Yo mismo encontré una solución al problema.
Aparentemente, la inicialización de los pesos no fue correcta. Funciona si cambio la inicialización a:
# HIDDEN LAYER 1
W1 = tf.Variable(tf.random_normal([D,M], stddev=1) / np.sqrt(D))
b1 = tf.Variable(tf.random_normal([M], stddev=1))
# HIDDEN LAYER 2
W2 = tf.Variable(tf.random_normal([M,M], stddev=1) / np.sqrt(M))
b2 = tf.Variable(tf.random_normal([M], stddev=1))
# OUTPUT LAYER
W3 = tf.Variable(tf.random_normal([M,K], stddev=1) / np.sqrt(M))
b3 = tf.Variable(tf.random_normal([K], stddev=1))
Por qué todavía no estoy muy seguro, agradecería cualquier respuesta y comentario.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras