发新帖

有关于tensorflow正则化的一些疑问(小白向)

[复制链接]
119 1

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
在学习正则化时看到这样一篇博文,代码很好读懂,但对一些逻辑关系有些疑问。
1、代码使用了循环结构来生成一个5层全连接网络,每循环一次都是调用了get_weight函数生成一个随机参数w。那这样的话在训练神经网络时,为了得到输出y,岂不是每次都要重新生成w参数?
2、代码中正则化损失是在函数get_weight中计算的,那么计算的就是随机生成的还未训练的w参数的正则化损失,我们需要的不是训练后的w正则化损失吗?

刚刚入坑深度学习,小白,希望有大神多多指教

代码如下:
#2. 定义一个获取权重,并自动加入正则项到损失的函数。
def get_weight(shape, lambda1):
    var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) # 生成一个变量
    tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var)) # add_to_collection()函数将新生成变量的L2正则化损失加入集合losses
    return var # 返回生成的变量

#3. 定义神经网络。
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))
sample_size = len(data)

# 每层节点的个数
layer_dimension = [2,10,5,3,1]
# 神经网络的层数
n_layers = len(layer_dimension)
# 这个变量维护前向传播时最深层的节点,开始的时候就是输入层
cur_layer = x
# 当前层的节点个数
in_dimension = layer_dimension[0]

# 循环生成网络结构
for i in range(1, n_layers):
    out_dimension = layer_dimension # layer_dimension为下一层的节点个数
    # 生成当前层中权重的变量,并将这个变量的L2正则化损失加入计算图上的集合
    weight = get_weight([in_dimension, out_dimension], 0.003)
    bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) # 偏置
    cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias) # 使用Relu激活函数
    in_dimension = layer_dimension  # 进入下一层之前将下一层的节点个数更新为当前节点个数

y= cur_layer

# 在定义神经网络前向传播的同时已经将所有的L2正则化损失加入了图上的集合,这里是损失函数的定义。
mse_loss = tf.reduce_sum(tf.pow(y_ - y, 2)) / sample_size # 也可以写成:tf.reduce_mean(tf.square(y_ - y`))
tf.add_to_collection('losses', mse_loss) # 将均方误差损失函数加入损失集合
# get_collection()返回一个列表,这个列表是所有这个集合中的元素,在本样例中这些元素就是损失函数的不同部分,将他们加起来就是最终的损失函数
loss = tf.add_n(tf.get_collection('losses'))
---------------------
作者:lilong117194
来源:CSDN
原文:https://blog.csdn.net/lilong117194/article/details/79130032
版权声明:本文为博主原创文章,转载请附上博文链接!

我知道答案 回答被采纳将会获得10 金币 + 5 金币 已有1人回答
本楼点评(0) 收起

精彩评论1

AI从入门到放弃  TF荚荚  发表于 2019-3-26 20:16:30 | 显示全部楼层
重新整理一下格式,代码如下
  1. def get_weight(shape, lambda1):
  2.     var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) # 生成一个变量
  3.     tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var)) # add_to_collection()函数将新生成变量的L2正则化损失加入集合losses
  4.     return var # 返回生成的变量

  5. #3. 定义神经网络。
  6. x = tf.placeholder(tf.float32, shape=(None, 2))
  7. y_ = tf.placeholder(tf.float32, shape=(None, 1))
  8. sample_size = len(data)

  9. # 每层节点的个数
  10. layer_dimension = [2,10,5,3,1]
  11. # 神经网络的层数
  12. n_layers = len(layer_dimension)
  13. # 这个变量维护前向传播时最深层的节点,开始的时候就是输入层
  14. cur_layer = x
  15. # 当前层的节点个数
  16. in_dimension = layer_dimension[0]

  17. # 循环生成网络结构
  18. for i in range(1, n_layers):
  19.     out_dimension = layer_dimension # layer_dimension为下一层的节点个数
  20.     # 生成当前层中权重的变量,并将这个变量的L2正则化损失加入计算图上的集合
  21.     weight = get_weight([in_dimension, out_dimension], 0.003)
  22.     bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) # 偏置
  23.     cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias) # 使用Relu激活函数
  24.     in_dimension = layer_dimension  # 进入下一层之前将下一层的节点个数更新为当前节点个数

  25. y= cur_layer

  26. # 在定义神经网络前向传播的同时已经将所有的L2正则化损失加入了图上的集合,这里是损失函数的定义。
  27. mse_loss = tf.reduce_sum(tf.pow(y_ - y, 2)) / sample_size # 也可以写成:tf.reduce_mean(tf.square(y_ - y`))
  28. tf.add_to_collection('losses', mse_loss) # 将均方误差损失函数加入损失集合
  29. # get_collection()返回一个列表,这个列表是所有这个集合中的元素,在本样例中这些元素就是损失函数的不同部分,将他们加起来就是最终的损失函数
  30. loss = tf.add_n(tf.get_collection('losses'))
复制代码
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

快速回复 返回顶部 返回列表