我正在研究张量流项目,我遇到了一个我不知道如何解决的问题。我想这是因为我不能正确理解张量流是如何运行的。
我认为与此问题相关的代码是:
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
先谢谢了。
答案 0 :(得分:0)
我已经解决了。问题出在前馈功能上。为了获得神经网络的输出,我在每个层中使用sigmoid函数作为激活函数。
output_data = tf.nn.sigmoid(output)
此激活函数的输出为0或1.这不一定是个问题,但在我的特定情况下,它产生相同的输出。发生这种情况是因为我在这一层中只有四个神经元,因此,由于样本之间的输入没有那么不同,因此输出很容易重复。
相反,使用整流线性单位(ReLU)作为激活函数,此函数的输出仅在输入小于0时为0,如果输入大于0则为本身。
output_data = tf.nn.relu(output)
用另一个改变最后一行,输出永远不会相同,即使输出非常相似,这是我的情况。
无论如何,我猜使用更复杂的神经网络,隐藏层更多,神经元更多,即使你使用了sigmoid函数,也不会出现这个问题。