我的三层神经网络的输出是NAN

时间:2017-11-30 08:59:42

标签: python tensorflow

我编写了一个简单的三层神经网络,没有任何优化或成本最小化。我只是初始化神经网络的权重,然后转发转发以获得输出。这是我的代码。

def create_placeholders(n_x, n_y):
    #n_x -- scalar, size of an image vector (num_px * num_px = 64 * 64 * 3 = 12288)
    #n_y -- scalar, number of classes (from 0 to 5, so -> 6)

    X = tf.placeholder(shape=[n_x, None],dtype=tf.float32)
    Y = tf.placeholder(shape=[n_y, None],dtype=tf.float32)
    return X, Y

现在参数初始化。

def initialize_parameters():
    tf.set_random_seed(1)                  
    W1 = tf.get_variable("W1", [25,1269], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    b1 = tf.get_variable("b1", [25,1], initializer = tf.zeros_initializer())
    W2 = tf.get_variable("W2", [12, 25], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    b2 = tf.get_variable("b2", [12, 1], initializer = tf.zeros_initializer())
    W3 = tf.get_variable("W3", [1, 12], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
    b3 = tf.get_variable("b3", [1, 1], initializer = tf.zeros_initializer())
    parameters = {"W1": W1,
                  "b1": b1,
                  "W2": W2,
                  "b2": b2,
                  "W3": W3,
                  "b3": b3}
    return parameters

现在是前馈的重要功能,我认为存在一些无法提供有效输出的问题。

def forward_propagation(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)                        # Z1 = np.dot(W1, X) + b1
    A1 = tf.nn.relu(Z1)                                    # A1 = relu(Z1)
    Z2 = tf.add(tf.matmul(W2,A1),b2)                       # Z2 = np.dot(W2, a1) + b2
    A2 = tf.nn.relu(Z2)                                    # A2 = relu(Z2)
    Z3 = tf.add(tf.matmul(W3,A2),b3)                       # Z3 = np.dot(W3,Z2) + b3 it should be # Z3 = np.dot(W3,A2) + b3
    return Z3

以下是我的培训数据的会话创建和运行代码,其代码为train_x_upsampledtrain_y_upsampled

tf.reset_default_graph()
X, Y = create_placeholders(n_x, n_y)
parameters = initialize_parameters()
Z = forward_propagation(X, parameters)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    X, Y, parameters, Z3 = sess.run([X, Y, parameters, Z], feed_dict={X: train_x_upsampled, Y: train_y_upsampled})
    print(Z3)

我想获得初始化参数的Z3输出值。目前我的输出无效。

[[ nan  nan  nan ...,  nan  nan  nan]]

1 个答案:

答案 0 :(得分:1)

所以我使用tf.verify_tensor_all_finite确定了问题。我的输入训练数据的两列包含NAN值,然后这些值又将整个网络的输出作为nan。我使用以下代码来确定这些列。

ar_fulldata_input_norm.loc[:, ar_fulldata_input_norm.isnull().any()]

这会将ar_fulldata_input_norm作为输入,并仅提供包含NAN值的列。

我想指出我的训练数据中引入了nan值,因为我的数据中最初的z得分归一化,所有行中的两列完全为零。我删除了这两列,问题就消失了。