[英]tf.Session.run not executing as expected
我正在做一個 tensorflow 項目,但遇到了一個我不知道如何解決的問題。 我想這是因為我沒有正確理解 tensorflow 是如何運行的。
我認為與問題相關的代碼是:
tf.reset_default_graph()
network_model.define_structure()
input_data = tf.placeholder(tf.float32, shape=[None, network_model.n_input_features])
nn_output = network_model.feedforward(input_data)
q_values = tf.Variable(tf.random_uniform([self.batch_size, network_model.n_classes], 0, 1))
# Configure number of cpus to be used by tf
exec_config = tf.ConfigProto(intra_op_parallelism_threads=self.n_cpus)
# Initialize variables
init = tf.global_variables_initializer()
with tf.Session(config=exec_config) as sess:
sess.run(init)
# Get input for the nn in a list
prepared_state = self.get_prepared_states()
sess.run(tf.assign(q_values, nn_output, validate_shape=False), feed_dict={input_data:prepared_state})
q_values_obtained = q_values.eval()
print(q_values_obtained)
問題是神經網絡的輸出( q_values_obtained
)有一個非常奇怪的行為:即使輸入不同,輸出也是一樣的(好像sess.run
沒有正確執行),有時,輸出會發生變化進行了一些迭代,但隨后又被修復了。
問題出在哪兒?
如果需要,我還會在 Network_model.py 類network_model.define_structure()
和network_model.feedforward()
添加函數,它們分別聲明神經網絡的權重並執行前饋步驟。
def define_structure(self):
"""The structure of the neural network is defined. From the attributes of the class, the hidden layers
are built.
"""
for i in range(self.n_hidden_layers+1):
if(i == 0):
self.weights.append(tf.Variable(tf.random_normal([self.n_input_features, self.n_neurons_layers[i]], stddev=3.0)))
self.biases.append(tf.Variable(tf.random_normal([self.n_neurons_layers[i]], stddev=3.0)))
elif(i==self.n_hidden_layers):
self.weights.append(tf.Variable(tf.random_normal([self.n_neurons_layers[i-1], self.n_classes], stddev=3.0)))
self.biases.append(tf.Variable(tf.random_normal([self.n_classes], stddev=3.0)))
else:
self.weights.append(tf.Variable(tf.random_normal([self.n_neurons_layers[i-1], self.n_neurons_layers[i]], stddev=3.0)))
self.biases.append(tf.Variable(tf.random_normal([self.n_neurons_layers[i]], stddev=3.0)))
return (self.weights, self.biases)
def feedforward(self, input_data, activation_function="sigmoid"):
"""Does a feedforward with the data received as argument and
returns the output
"""
# (input_data * weights) + biases
print("In network_model.feedforward")
for i in range(self.n_hidden_layers):
output = tf.add(tf.matmul(tf.cast(input_data, tf.float32), self.weights[i]), self.biases[i])
output_data = tf.nn.sigmoid(output)
input_data = output_data
output = tf.add(tf.matmul(input_data, self.weights[self.n_hidden_layers]), self.biases[self.n_hidden_layers])
return output
我已經解決了。 問題出在前饋功能上。 為了獲得神經網絡的輸出,我在每一層都使用了 sigmoid 函數作為激活函數。
output_data = tf.nn.sigmoid(output)
這個激活函數的輸出是 0 或 1。這不一定是一個問題,但在我的特殊情況下,它產生了相同的輸出。 發生這種情況是因為我在這一層只有四個神經元,因此,由於樣本之間的輸入差異不大,因此很容易重復輸出。
相反,使用整流線性單元(ReLU)作為激活函數,只有當輸入小於 0 時,該函數的輸出才為 0,如果輸入大於 0,則輸出值本身。
output_data = tf.nn.relu(output)
將最后一行與另一行更改,輸出永遠不會相同,即使輸出非常相似,這就是我的情況。
無論如何,我想使用具有更多隱藏層和更多神經元的更復雜的神經網絡,即使使用 sigmoid 函數也不會有這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.