2017-10-19 20 views
4

Récemment, je travaille avec Tensorflow. J'explorais comment implémenter Perceptron multicouche dans Tensorflow.Comment créer un nombre variable de couches dans MLP

Je suis passé par beaucoup de tutoriel en ligne. la plupart d'entre eux utilisent une ou deux couches cachées. Un exemple simple est tiré de here

def forwardprop(X, w_1, w_2): 
    """ 
    Forward-propagation. 
    IMPORTANT: yhat is not softmax since TensorFlow's 
    softmax_cross_entropy_with_logits() does that internally. 
    """ 
    h = tf.nn.sigmoid(tf.matmul(X, w_1)) # The \sigma function 
    yhat = tf.matmul(h, w_2) # The \varphi function 
    return yhat 

X = tf.placeholder("float", shape=[None, x_size]) 
y = tf.placeholder("float", shape=[None, y_size]) 

# Weight initializations 
w_1 = init_weights((x_size, h_size)) 
w_2 = init_weights((h_size, y_size)) 

# Forward propagation 
out = forwardprop(X, w_1, w_2) 

Dans ce code, il y a une couche cachée. Maintenant, je me demande si je voulais construire un nombre variable de réseaux neuronaux entièrement connectés en couches. Supposons une liste h_archi = [100 150 100 50] où chacune de la valeur représente un nombre de neurones dans la première couche (dans ce cas, le nombre total de couche est 4). Donc, pour nombre variable de mise en œuvre de la couche, je le code laid codé suivant,

emb_vec = tf.Variable(tf.random_normal([vocabulary_size, EMBEDDING_DIM]), name="emb_vec") 

    tot_layer = len(h_archi) 
    op = np.zeros(tot_layer+1) 
    hid_rep = np.zeros(tot_layer+1) 
    bias = np.zeros(tot_layer+1) 

    op[0] = tf.matmul(x, emb_vec) 

    for idx,tot_neu in enumerate(h_archi): 
     assert(tot_neu > 0) 
     layer_no = idx+1 
     r,c = op[layer_no-1].get_shape() 
     hid_rep[layer_no] = tf.Variable(tf.random_normal([c,tot_neu]),name="hid_{0}_{1}".format(layer_no-1,layer_no)) 
     bias[layer_no] = tf.Variable(tf.random_normal([tot_neu]), name="bias_{0}".format(layer_no)) 
     op[layer_no] = tf.add(tf.matmul(op[layer_no-1],hid_rep[layer_no]),bias[layer_no]) 

    r,c = op[tot_layer].get_shape() 
    last_layer = tf.Variable(tf.random_normal([c,output_size]),name="hid_{0}_{1}".format(tot_layer,"last_layer")) 
    bias_last = tf.Variable(tf.random_normal([output_size]), name="bias_last") 
    output = tf.add(tf.matmul(op[tot_layer],last_layer)) 
    prediction = tf.nn.softmax(output) 

Ce code est complètement faux que tensorflow ne prend pas en charge l'opération d'affectation. Alors, quelle pourrait être la bonne façon de concevoir une telle chose.

Répondre

2

Vous pourriez faire quelque chose comme ça au lieu de la boucle:

last_layer=x 
    for idx,tot_neu in enumerate(h_archi): 
     assert(tot_neu > 0) 
     layer_no = idx+1 
     r,c = last_layer.get_shape() 
     weights_ = tf.Variable(tf.random_normal([c,tot_neu]),name="hid_{0}_{1}".format(layer_no-1,layer_no)) 
     bias_ = tf.Variable(tf.random_normal([tot_neu]), name="bias_{0}".format(layer_no)) 
     last_layer = tf.add(tf.matmul(last_layer,weights_),bias_) 
    r,c = last_layer.get_shape() 

Si vous avez besoin d'accéder aux intermédiaires tenseurs (préjugés, poids, couches, etc.), vous pouvez simplement les stocker à chaque étape dans un liste par exemple

+0

Merci beaucoup pour votre aide. –