2.损失函数最终要带入到优化器的minimize方法中做参数。minimize方法内部包含了compute_gradients和apply_gradients方法。
3. 优化器的minimize方法返回的是operation,一般命名为train_step。
4.session的run方法的参数,如果是operation,则返回值为None;如果是tensor,则返回值是ndarray。因此sess.run(train_step,feed_dict)无返回结果,只起训练作用。
5.Variable定义时必须给出初始值。Variable是变量,其值保存在session中,session的global_variable_initializer实际上是初始值的保存。
结果:你会发现第一个输出与第三个一致,第二个输出和第四个一致
reduce_sum 是 tensor 内部求和的工具。其参数中:
其实在reduce_sum()中,是从维度上去考虑的(感觉这个Matlab中数据的概念比较像)
调用 reduce_sum(arg1, arg2) 时,参数 arg1 即为要求和的数据, arg2 有两个取值分别为 0 和 1 ,通常用 reduction_indices=[0] 或 reduction_indices=[1] 来传递参数。从上图可以看出,当 arg2 = 0 时,是纵向对矩阵求和,原来矩阵有几列就得到几个值;相似地,当 arg2 = 1 时,是横向对矩阵求和;当省略 arg2 参数时,默认对矩阵所有元素进行求和。
在 reduce_sum() 中就是按照求和的方式对矩阵降维。
计算张量的各个维度上的元素的平均值。
l2_loss一般用于优化目标函数中的正则项,防止参数太多复杂容易过拟合(所谓的过拟合问题是指当一个模型很复杂时,它可以很好的“记忆”每一个训练数据中的随机噪声的部分而忘记了要去“学习”训练数据中通用的趋势)
结果输出:
7.0
计算的过程:
题外话
正则化的基本思想是向损失函数添加一个惩罚项用于惩罚大的权重,隐式地减少自由参数的数量,所以可以达到d性地适用不同数据量训练的要求而不产生过拟合的问题。
正则化方法是将惩罚因子加入到各层的参数或激活函数中。其实现位置通常是在模型的optimization里,在计算损失函数时将该惩罚因子加进去。
( http://www.cnblogs.com/guqiangjs/p/7805098.html )
tf.trainable_variables 返回所有 当前计算图中 在获取变量时未标记 trainable=False 的变量集合.
输出
tf.nn.l2_loss()和tf.contrib.layers.l2_regularizer(),使用示例如下:import tensorflow as tf
weights = tf.constant([[1,2,3], [4,5,6]], dtype=tf.float32)
sess = tf.InteractiveSession()
# 计算的是所有元素的平方和再除以2
print(tf.nn.l2_loss(weights).eval()())
# 等价于
print(tf.contrib.layers.l2_regularizer(1.)(weights).eval())
# output: 45.5
接下来将介绍两种方法将l2正则化项添加到损失函数后:
一、遍历trainable variables添加L2正则化项:
1.遍历可训练参数,将每个参数传入tf.nn.l2_loss()进行计算并相加起来;
2.乘以weight_decay并与base_loss相加。
weight_decay = 0.001
base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))
l2_loss = weight_decay * tf.add_n([tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()])
loss = base_loss + l2_loss
注意:该过程对每个trainable variable都进行了l2正则化,包括权值w和偏置b。有种说法是如果对偏执b进行l2正则化将会导致欠拟合,一般只需要对权值w进行正则化,所以来看第二种方法。
二、在构造网络层时传入l2正则化函数:
如下所示,在构造网络层时,将'kernel_initializer'参数设为l2正则化函数,则tensorflow会将该权重变量(卷积核)的l2正则化项加入到集合 tf.GraphKeys.REGULARIZATOIN_LOSSES里。
x = tf.layers.conv2d(x, 512, (3, 3),
padding='same',
activation=tf.nn.relu,
kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
kernel_regularizer=tf.contrib.layers.l2_regularizer(0.001)
在计算loss时使用tf.get_collection()来获取tf.GraphKeys.REGULARIZATOIN_LOSSES集合,然后相加即可:
base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))
l2_loss = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n([base_loss] + l2_loss, name="loss")
欢迎补充指正。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)