这个函数如何创建一个深层的神经网络而不只是重命名同一个变量?

2024-10-03 19:21:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我是从Geron的“机器学习”中自学的,我对这个函数(在下一页的框[114]中)如何创建一个深层的神经网络有点困惑。你知道吗

https://github.com/ageron/handson-ml/blob/master/11_deep_learning.ipynb

he_init = tf.variance_scaling_initializer()

def dnn(inputs, n_hidden_layers=5, n_neurons=100, name=None,
        activation=tf.nn.elu, initializer=he_init):
    with tf.variable_scope(name, "dnn"):
        for layer in range(n_hidden_layers):
            inputs = tf.layers.dense(inputs, n_neurons, activation=activation,
                                     kernel_initializer=initializer,
                                     name="hidden%d" % (layer + 1))
        return inputs

看起来它每次都用不同的名称重置相同的输入。有人能解释一下这是如何建立一个深层神经网络的吗?你知道吗


Tags: namelayerinitlayerstf神经网络activationhidden
1条回答
网友
1楼 · 发布于 2024-10-03 19:21:31

对于张量流模型的构造存在着强烈的误解。建议您在official guide中阅读更多关于TensorFlow的计算图和该API的其他低级细节。你知道吗

使用TensorFlow构建的操作不绑定到Python变量 (假设我们并不急于得到这个答案)。当调用tf.layers中的一个层构造函数(或其他基本函数,如tf.nn)时,它将向当前活动的图中添加新操作,并返回与该层的输出相对应的Tensor。删除或更改用于保存这些张量的Python变量的内容时,这些操作不会消失。你知道吗

函数dnn所做的是迭代地创建一个密集层序列。在每一步中,变量inputs都被更改为指向最近创建的层的输出,从而允许将其“输入”到下一个层中。是使用与原始输入相同的变量,还是使用新的变量,这是一个意见问题(我自己经常使用一个新变量)。默认情况下,这将导致5个完全连接的层的序列。所有这些都只构建了图;没有实际应用网络训练或权重初始化过程。你知道吗

这也可以通过视觉验证。以下代码将图形的签名写入TensorFlow摘要文件:

he_init = tf.variance_scaling_initializer()

def dnn(inputs, n_hidden_layers=5, n_neurons=100, name=None,
        activation=tf.nn.elu, initializer=he_init):
    with tf.variable_scope(name, "dnn"):
        for layer in range(n_hidden_layers):
            inputs = tf.layers.dense(inputs, n_neurons, activation=activation,
                                     kernel_initializer=initializer,
                                     name="hidden%d" % (layer + 1))
        return inputs

x = tf.placeholder(tf.float32, [32, 128])
y = dnn(x)
writer = tf.summary.FileWriter(logdir='mydnn', graph=tf.get_default_graph())
writer.flush()

通过使用TensorBoard打开同一个日志目录,我们得到以下图形:

enter image description here

相关问题 更多 >