首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tensorflow中实现MLP

在tensorflow中实现MLP
EN

Stack Overflow用户
提问于 2016-01-29 06:14:35
回答 2查看 3.2K关注 0票数 1

我想使用tensorflow实现在https://www.coursera.org/learn/machine-learning中教授的MLP模型。这是实现。

代码语言:javascript
复制
# one hidden layer MLP

x = tf.placeholder(tf.float32, shape=[None, 784])
y = tf.placeholder(tf.float32, shape=[None, 10])

W_h1 = tf.Variable(tf.random_normal([784, 512]))
h1 = tf.nn.sigmoid(tf.matmul(x, W_h1))

W_out = tf.Variable(tf.random_normal([512, 10]))
y_ = tf.matmul(h1, W_out)

# cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(y_, y)
cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)
loss = tf.reduce_mean(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# train
with tf.Session() as s:
    s.run(tf.initialize_all_variables())

    for i in range(10000):
        batch_x, batch_y = mnist.train.next_batch(100)
        s.run(train_step, feed_dict={x: batch_x, y: batch_y})

        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch_x, y: batch_y})
            print('step {0}, training accuracy {1}'.format(i, train_accuracy))

但是,它不起作用。我认为这些层的定义是正确的,但问题在cross_entropy中。如果我使用第一个,一个被注释掉,模型很快就会收敛;但是如果我使用第二个,我认为/希望是前一个方程的转换,模型就不会收敛。

如果您想查看成本公式,您可以在here找到它。

更新

我已经使用numpy和scipy实现了同样的MLP模型,而且它可以工作。

在tensorflow代码中,我在训练循环中添加了一条打印行,我发现y_中的所有元素都是nan...I,认为它是由算术溢出或类似的东西引起的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-03 13:56:46

这很可能是0*log(0)问题。

顶替

代码语言:javascript
复制
cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)

使用

代码语言:javascript
复制
cross_entropy = tf.reduce_sum(- y * tf.log(tf.clip_by_value(y_, 1e-10, 1.0)) - (1 - y) * tf.log(tf.clip_by_value(1 - y_, 1e-10, 1.0)), 1)

请看Tensorflow NaN bug?

票数 3
EN

Stack Overflow用户

发布于 2016-01-29 10:29:33

我认为问题在于,nn.sigmoid_cross_entropy_with_logits期望得到未规范化的结果,在这个函数中,您可以用cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)替换它。

期望y_在0到1之间(由乙状结肠)标准化

试着替换

代码语言:javascript
复制
y_ = tf.matmul(h1, W_out)

使用

代码语言:javascript
复制
y_ = tf.nn.sigmoid(tf.matmul(h1, W_out))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35078027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档