请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于计算图的问题

关于dropout:
fc1_dropout = tf.contrib.layers.dropout(fc1, keep_prob) 为什么这个输出的shape还是[100, 64],不是应该把神经元dropout了吗,应该是小于64的吧?
关于loss:
cnn中的loss是通过tf.losses.sparse_softmax_cross_entropy(…)直接得到的,这个api输出是一个标量啊,为什么rnn中需要做个tf.reduce_mean(),是不是两个api不一样啊?还有请说一下为什么cnn中输出的是一个标量?
关于上面这个api不是已经把logits给softmax了吗,为什么在后面y_pred = tf.argmax(tf.nn.softmax(logits),…) 中还要加个softmax,这里应该多余了吧?
还有为什么需要给每一个参数关于loss的梯度做一个限制,这样做的目的是什么?如果不做的话会有什么问题?
train_op中没有cnn中的minimize(loss),这样还会是减少loss的吗?是怎么实现训练降低loss的

正在回答 回答被采纳积分+3

1回答

正十七 2019-03-08 00:25:15

“fc1_dropout = tf.contrib.layers.dropout(fc1, keep_prob) 为什么这个输出的shape还是[100, 64],不是应该把神经元dropout了吗,应该是小于64的吧?”

dropout的原理是强制某些位置上的输出为0,而不是减小输出的size。不然的话训练时和测试时的计算图就不一样了。

”cnn中的loss是通过tf.losses.sparse_softmax_cross_entropy(…)直接得到的,这个api输出是一个标量啊,为什么rnn中需要做个tf.reduce_mean(),是不是两个api不一样啊?还有请说一下为什么cnn中输出的是一个标量?“

之前的课程中讲过softmax的计算过程,logits和real_value 输入进来之后,

a. logits 经过softmax后变为概率分布

b. real_value 做one_hot处理变成跟logits同维度的真实分布

c 真实分布和概率分布做交叉熵运算,即每个分量做(y1)log(y2)的运算。然后把结果加起来。

这样cnn中得到的就是标量。

”关于上面这个api不是已经把logits给softmax了吗,为什么在后面y_pred = tf.argmax(tf.nn.softmax(logits),…) 中还要加个softmax,这里应该多余了吧?“

计算图中做softmax会在后面加一个节点来表达softmax后的数据,原来的节点上的数据没变啊。

”为什么rnn中需要做个tf.reduce_mean(),“

rnn中有很多步啊,每一步都有一个标量数据,所以是一个向量,需要做平均。

”还有为什么需要给每一个参数关于loss的梯度做一个限制,这样做的目的是什么?如果不做的话会有什么问题?“

不做的话rnn很容易梯度爆炸。

”train_op中没有cnn中的minimize(loss),这样还会是减少loss的吗?是怎么实现训练降低loss的“

使用梯度下降来降低loss,具体就是计算每个参数的梯度,然后更新为w = w - 步长 * 导数。既然每个参数都是向着使loss变小的方向来移动,那么一般来说loss就会变小的。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕沐734317 #1
    可是rnn计算loss的时候给的logits只是最后一步的数据,这里做的reduce-mean只能是理解成把一个batch做一个平均啊,可是cnn中也是传入的一个batchsize的数据呀
    回复 有任何疑惑可以回复我~ 2019-03-08 01:08:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信