tf.Session.run没有按预期执行

时间:2018-06-05 14:20:07

标签: python-3.x 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没有正确执行),有时,输出会在某些迭代中发生变化,但之后会再次修复。

我是tensorflow的初学者,我无法理解发生了什么。有人知道问题出在哪里吗?

如果需要,我还会添加Network_model.py类network_model.define_structure()和network_model.feedforward()中的函数,它们分别声明神经网络的权重并执行前馈步骤。 / p>

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

先谢谢了。

1 个答案:

答案 0 :(得分:0)

我已经解决了。问题出在前馈功能上。为了获得神经网络的输出,我在每个层中使用sigmoid函数作为激活函数。

output_data = tf.nn.sigmoid(output)

此激活函数的输出为0或1.这不一定是个问题,但在我的特定情况下,它产生相同的输出。发生这种情况是因为我在这一层中只有四个神经元,因此,由于样本之间的输入没有那么不同,因此输出很容易重复。

相反,使用整流线性单位(ReLU)作为激活函数,此函数的输出仅在输入小于0时为0,如果输入大于0则为本身。

output_data = tf.nn.relu(output)

用另一个改变最后一行,输出永远不会相同,即使输出非常相似,这是我的情况。

无论如何,我猜使用更复杂的神经网络,隐藏层更多,神经元更多,即使你使用了sigmoid函数,也不会出现这个问题。