关于计算图的问题
来源:7-14 计算图实现
慕沐734317
2019-03-02
关于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的
1回答
-
正十七
2019-03-08
“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就会变小的。
012019-03-08
相似问题