我编写了一个简单的三层神经网络,没有任何优化或成本最小化。我只是初始化神经网络的权重,然后转发转发以获得输出。这是我的代码。
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_upsampled
和train_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]]
答案 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得分归一化,所有行中的两列完全为零。我删除了这两列,问题就消失了。