【问题标题】:tensorflow training on simple neural network does not improve accuracy简单神经网络上的 tensorflow 训练不会提高准确性
【发布时间】:2017-11-07 18:45:05
【问题描述】:

我得到了下面的网络,当我训练它时,准确度仍然是 0.000。我试图通过仅包含 2 个样本来简化它。除了其中一个样本外,输入全为零。样本之间的区别在于,在处处为零的情况下,输出类似于 0.3 0.4 0.3,而在另一种情况下,输出为 0.4 0.3 0.3(两者总和为 1)。我希望仅在两个训练样本上就很容易获得至少 50% 的准确率,甚至可能 100%。

问题:我的网络配置有问题吗?如果没有,关于如何进行的任何建议。到目前为止,tensorflow 对我来说并不容易调试。

可能有相关性:我首先将权重和偏差初始化为零,然后得到 0.5 的准确度。当我在训练后打印层的内容时,只有输出层的权重和偏差包含正值。

self.session = tf.Session()
n_hidden_1 = 10 # 1st layer number of neurons
n_hidden_2 = 10 # 2nd layer number of neurons
self.num_input = 68 # data values
self.num_classes = 18

self.weights = {
    'h1': tf.Variable(tf.random_normal([self.num_input, n_hidden_1])),
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
    'out': tf.Variable(tf.random_normal([n_hidden_2, self.num_classes]))
}
self.biases = {
    'b1': tf.Variable(tf.random_normal([n_hidden_1])),
    'b2': tf.Variable(tf.random_normal([n_hidden_2])),
    'out': tf.Variable(tf.random_normal([self.num_classes]))
}
self.input = tf.placeholder(dtype=tf.float32, shape = [None, self.num_input])
self.output = tf.placeholder(dtype=tf.float32, shape = [None, self.num_classes])
layer_1 = tf.nn.relu(tf.add(tf.matmul(self.input, self.weights['h1']), self.biases['b1']))
# Hidden fully connected layer with 256 neurons
layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, self.weights['h2']), self.biases['b2']))
# Output fully connected layer with a neuron for each class
self.out_layer = tf.nn.softmax(tf.matmul(layer_2, self.weights['out']) + self.biases['out'])

self.loss_op = tf.reduce_mean(tf.squared_difference(self.out_layer, self.output))
optimizer = tf.train.AdamOptimizer(learning_rate=0.1)
self.train_op = optimizer.minimize(self.loss_op)

# Evaluate model
correct_pred = tf.equal(tf.argmax(self.out_layer, 1), tf.argmax(self.output, 1))
self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
self.session.run(tf.global_variables_initializer())

def train(self,train_x,train_y):
    loss, acc = self.session.run([self.loss_op, self.accuracy], feed_dict={self.input: train_x, self.output: train_y})
    self.logger.info("Before training Loss= " + \
              "{:.4f}".format(loss) + ", Training Accuracy= " + \
              "{:.3f}".format(acc))

    self.session.run(self.train_op, feed_dict={self.input: train_x, self.output: train_y})
    loss, acc = self.session.run([self.loss_op, self.accuracy], feed_dict={self.input: train_x, self.output: train_y})
    self.logger.info("After training Loss= " + \
              "{:.4f}".format(loss) + ", Training Accuracy= " + \
              "{:.3f}".format(acc))

【问题讨论】:

  • 你只运行一次train(...) 吗?您需要循环调用session.run(train_op, feed_dict=...)。该调用只会对参数进行一次更新,这不会比随机初始化好多少。
  • 您的代码似乎使用 self ,就好像它在一个类中一样,但您没有类定义。你能发布一个更完整的代码示例吗?
  • @DavidParks:我怎么错过了……我试过了,效果很好!谢谢!你能发表你的评论作为答案吗?

标签: tensorflow


【解决方案1】:

您似乎只运行了一次train(...)。您需要循环调用session.run(train_op, feed_dict=...)

该调用只会对参数进行一次更新,这不会比随机初始化好多少。

【讨论】:

    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2018-01-10
    • 2017-09-06
    • 2017-05-23
    相关资源
    最近更新 更多