Проблема в функции прогнозирования для нейронной сети свертки (Tensorflow) - PullRequest
0 голосов
/ 14 ноября 2018

Следующая функция прогнозирования работает нормально в случае не сверточной модели прямого распространения,

def predict(X, parameters):

    W1 = tf.convert_to_tensor(parameters["W1"])
    b1 = tf.convert_to_tensor(parameters["b1"])
    W2 = tf.convert_to_tensor(parameters["W2"])
    b2 = tf.convert_to_tensor(parameters["b2"])
    W3 = tf.convert_to_tensor(parameters["W3"])
    b3 = tf.convert_to_tensor(parameters["b3"])

    params = {"W1": W1,
              "b1": b1,
              "W2": W2,
              "b2": b2,
              "W3": W3,
              "b3": b3}

    x = tf.placeholder("float", [12288, 1])

    z3 = forward_propagation_for_predict(x, params)
    p = tf.argmax(z3)

    sess = tf.Session()
    prediction = sess.run(p, feed_dict = {x: X})

    return prediction

def forward_propagation_for_predict(X, parameters):
    W1 = parameters['W1']
    b1 = parameters['b1']
    W2 = parameters['W2']
    b2 = parameters['b2']
    W3 = parameters['W3']
    b3 = parameters['b3'] 

    Z1 = tf.add(tf.matmul(W1, X), b1)                      
    A1 = tf.nn.relu(Z1)                                    
    Z2 = tf.add(tf.matmul(W2, A1), b2)                     
    A2 = tf.nn.relu(Z2)                                    
    Z3 = tf.add(tf.matmul(W3, A2), b3)                     

    return Z3

Я попытался изменить код для сверточного forward_propagation и применил следующие изменения,

def predict(X, parameters):
    X = np.reshape(X,(1,100,100,3)) 
    W1 = tf.convert_to_tensor(parameters["W1"])
    W2 = tf.convert_to_tensor(parameters["W2"])


    params = {"W1": W1,
              "W2": W2,
              }

    x = tf.placeholder("float", [1,100,100,3])

    z3 = forward_propagation_for_predict(x, params)
    p = tf.argmax(z3)
    init = tf.global_variables_initializer() 
    sess = tf.Session()
    sess.run(init)                           
    prediction = sess.run(p, feed_dict = {x: X})
    return prediction

def forward_propagation_for_predict(X, parameters): #altered implementation for convolutional NN
    # Retrieve the parameters from the dictionary "parameters" 
    W1 = parameters['W1']
    W2 = parameters['W2']


    Z1 = tf.nn.conv2d(X, W1, strides = [1,1,1,1], padding = 'SAME')
    # RELU
    A1 = tf.nn.relu(Z1)
    # MAXPOOL: window 8x8, sride 8, padding 'SAME'
    P1 = tf.nn.max_pool(A1, ksize = [1,8,8,1], strides = [1,8,8,1], padding = 'SAME')
    # CONV2D: filters W2, stride 1, padding 'SAME'
    Z2 = tf.nn.conv2d(P1, W2, strides = [1,1,1,1], padding = 'SAME')
    # RELU
    A2 = tf.nn.relu(Z2)
    # MAXPOOL: window 4x4, stride 4, padding 'SAME'
    P2 = tf.nn.max_pool(A2, ksize = [1,4,4,1], strides = [1,4,4,1], padding = 'SAME')
    # FLATTEN
    P2 = tf.contrib.layers.flatten(P2)
    # FULLY-CONNECTED without non-linear activation function (not not call softmax).
    Z3 = tf.contrib.layers.fully_connected(P2, 6, activation_fn=None)

    return Z3

У меня возникают следующие сомнения / проблемы,

  1. Измененная реализация требует инициализации параметров tf, тогда как в исходной реализации это не требовалось (если параметры tf должныбыть инициализированным перед его использованием, тогда как получается, что он работает в исходной реализации)

  2. После инициализации параметров ответом будет вектор всех нулей, а не один горячий.(Например, array([0, 0, 0, 0, 0, 0], dtype=int64))

Примечание. Я не использую смещения, поэтому я удалил эти параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...