2017-10-29 15 views
1

xor関数をゼロから認識するニューラルネットワークを作成しようとしています。完全なコードはhere(python 3)です。基本的なXORニューラルネットワークプログラムの作成

私は現在、エラーを取得しています:

ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients 

は私がtensorflowに新しいですし、これは、なぜ私は理解していません。誰も私のコードを修正する際に私を助けることができますか?前もって感謝します。

P.S.質問にもっと詳細が必要な場合は、downvotingの前に私に知らせてください。再度、感謝します!

編集:コードの関連部分:

def initialize_parameters(): 
    # Create Weights and Biases for Hidden Layer and Output Layer 
    W1 = tf.get_variable("W1", [2, 2], initializer = tf.contrib.layers.xavier_initializer()) 
    b1 = tf.get_variable("b1", [2, 1], initializer = tf.zeros_initializer()) 
    W2 = tf.get_variable("W2", [1, 2], initializer = tf.contrib.layers.xavier_initializer()) 
    b2 = tf.get_variable("b2", [1, 1], initializer = tf.zeros_initializer()) 
    parameters = { 
      "W1" : W1, 
      "b1" : b1, 
      "W2" : W2, 
      "b2" : b2 
    } 
    return parameters 

def forward_propogation(X, parameters): 

    threshold = tf.constant(0.5, name = "threshold") 
    W1, b1 = parameters["W1"], parameters["b1"] 
    W2, b2 = parameters["W2"], parameters["b2"] 

    Z1 = tf.add(tf.matmul(W1, X), b1) 
    A1 = tf.nn.relu(Z1) 
    tf.squeeze(A1) 
    Z2 = tf.add(tf.matmul(W2, A1), b2) 
    A2 = tf.round(tf.sigmoid(Z2)) 
    print(A2.shape) 
    tf.squeeze(A2) 
    A2 = tf.reshape(A2, [1, 1]) 
    print(A2.shape) 
    return A2 

def compute_cost(A, Y): 

    logits = tf.transpose(A) 
    labels = tf.transpose(Y) 
    cost = tf.nn.sigmoid_cross_entropy_with_logits(logits = logits, labels = labels) 
    return cost 

def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.0001, num_epochs = 1500): 

    ops.reset_default_graph() 
    (n_x, m) = X_train.shape 
    n_y = Y_train.shape[0] 
    costs = [] 
    X, Y = create_placeholders(n_x, n_y) 
    parameters = initialize_parameters() 
    A2 = forward_propogation(X, parameters) 
    cost = compute_cost(A2, Y) 
    optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cost) 
    init = tf.global_variables_initializer() 

    with tf.Session() as session: 
     session.run(init) 
     for epoch in range(num_epochs): 
      epoch_cost = 0 
      _, epoch_cost = session.run([optimizer, cost], feed_dict = {X : X_train, Y : Y_train}) 
     parameters = session.run(parameters) 
     correct_prediction = tf.equal(tf.argmax(A2), tf.argmax(Y)) 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 
     print("Training Accuracy is {0} %...".format(accuracy.eval({X : X_train, Y : Y_train}))) 
     print("Test Accuracy is {0} %...".format(accuracy.eval({X : X_test, Y : Y_test}))) 
    return parameters 
+0

コード全体を外部リンクにリンクするのではなく、コード自体の関連部分を適切に含めること。 –

答えて

0

あなたが(ちなみにknown issue、)A2を定義するときにエラーがtf.roundの使用によって引き起こされます。

解決策は、単にtf.roundを使用しないことです。 tf.sigmoidの出力は、01の間の値であり、結果の確率として解釈することができることを覚えておいてください。1クロスエントロピーロス関数は、ターゲットまでの距離を測定するもので、0または1であり、この距離に基づいて重み付けに必要な更新を計算します。クロスエントロピーが0または1のいずれかに絞られる前にtf.roundを呼び出すと、クロスエントロピーが無意味になります。

ちなみに、tf.losses.softmax_cross_entropyは、2番目のレイヤーで自分がシグモイドを適用したので、うまくいくはずです。

+0

ありがとうございます。今は動作していますが、1.0%の精度を与えています:/それを改善する手助けはできますか?答えを正しいものとしてマークします。ありがとう! –

+0

問題のコードを再現できるように更新できますか? – Maxim

関連する問題