簡體   English   中英

tf.Session.run 未按預期執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM