python - TensorFlow:如何有效地训练每一层都需要馈送的网络?

标签 python tensorflow

通常,标准网络实现的唯一馈送是输入/标签。您将输入和标签/真相作为占位符,并将具体数据传递给 feed_dict 以进行训练循环。

我的模型由多个网络组成,就像一个网络,其中每一层本身就是一个网络。模型中的每个层网络接受两个输入:一个数据输入和一个用于图卷积的邻接表。

如果唯一需要的输入是数据输入,那么使用占位符就不会有问题,因为不需要在模型的层网络之间进行馈送。然而,邻接列表是由 numpysklearn 函数创建的,它们需要真正的数据输入(如 numpy 数组)而不是占位符张量。

我的网络看起来像这样:

# <make X* and alist* inputs placeholders>

# forwad through the layer-networks
H1 = network_fwd(X0, alist0, var_scope=SCOPE.format(0)) # params_0/*
H2 = network_fwd(H1, alist1, var_scope=SCOPE.format(1)) # params_1/*
H3 = network_fwd(H2, alist2, var_scope=SCOPE.format(2))
# ...
H10 = network_fwd(H9, alist9, var_scope=SCOPE.format(9))

# optimize on sum network error
error = loss_fn(H1, X1)
error += loss_fn(H2, X2)
error += loss_fn(H3, X3)
#...
error += loss_fn(H10, X10)

train = tf.train.AdamOptimizer(learning_rate).minimize(error)

# train
for step in range(num_steps):
    x_batch = numpy_ops.next_minibatch(X_train, mb_size) # list of data inputs

    # fill placeholders for true inputs X0, X1, ..., X10
    fdict = {placeholder_name: x for placeholder_name, x in zip(pnames, x_batch)}

    # layer-network predictions and adj lists
    adj_list0 = numpy_ops.get_adjacency_list(x_batch[0], K)
    fdict[alist0] = adj_list0
    #=====================================
    h1 = sess.run(H1, feed_dict=fdict)
    fdict[alist1] = numpy_ops.get_adjacency_list(h1, K)
    #=====================================
    h2 = sess.run(H2, feed_dict=fdict)
    fdict[alist2] = numpy_ops.get_adjacency_list(h2, K)
    # ...

    # and finally the actual training pass
    train.run(feed_dict=fdict)

我已经在我的示例代码中使用硬编码行明确说明了一些事情,所以我不需要关于它的清理提示。问题是每个 network_fwd 都需要为 alist 提供数据,因此每个先前的预测/输出都会为每个后续层网络重新计算,以获得下一层在前一层的邻接列表输出。

效率极低,但我不能将 tensorflow ops 用于邻接列表函数。有没有办法通过模型的网络进行单次传递(每个 H* 只计算一次)?

在像 Chainer 这样的运行时自动差异框架中,这不是问题,因为您可以在正向执行期间执行邻接列表函数或任何其他非框架数据处理函数,但我真的很困惑如何在TF.

最佳答案

@mikkolatf.py_func 包装函数的建议为我工作。

我如何使用 tf.py_func:

# <initialize all child network variables>

# make adjacency list function interface for tf.py_func
def alist_func(h_in):
    """ Given constraints on the input to the func arg in tf.py_func,
        you may need to interface the numpy function if it's signature
        has other args or kwargs
    """
    return numpy_ops.get_adjacency_list(h_in, K)

# direct graph
data_in_shape = (11, None, num_points, D)
X_input = tf.placeholder(tf.float32, shape=data_in_shape, name='X_input')
X_pred, loss = tensor_ops.multi_func_model_fwd(X_input, var_scopes, alist_func)

# optimizer
train = tf.train.AdamOptimizer(learning_rate).minimize(loss)

# train
for step in range(num_steps):
    x_batch = numpy_ops.next_minibatch(X_train, mb_size) # list of data inputs
    train.run(feed_dict={X_input: x_batch})



# in tensor_ops script, this is how I use tf.py_func
def meta_model_fwd(x_in, var_scopes, alist_fn, *args, **kwargs):
    alist = tf.py_func(alist_fn, [x_in[0]], tf.int32) # inp is float32, out is int32
    h = model_fwd(x_in[0], alist, var_scopes[0], *args, **kwargs)
    loss = loss_fn(h, x_in[1])
    for idx, vscope in enumerate(var_scopes[1:]):
        alist = tf.py_func(alist_fn, [h], tf.int32)
        h = model_fwd(h, alist, vscope, *args, **kwargs)
        loss += loss_fn(h, x_in[idx+1])
    return h, loss

再次感谢mikkola!

关于python - TensorFlow:如何有效地训练每一层都需要馈送的网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48915279/

相关文章:

python - 由tensorflow中的索引张量指定的切片2d张量

python - 从pd数据帧到Excel的分层索引,需要转发填充和取消合并

tensorflow - tensorflow 中计数操作不匹配

python - Django 模板如何显示货币值,如 4.8p

python - 在python中以特定格式获取日期

python - 在 tensorflow 模型中关闭softmax

python - 如何使用tensorflow 2生成frozen_inference_graphe.pb和.pbtxt文件

tensorflow - 在 Google Colab 中使用多个 GPU 在 Tensorflow 中进行分布式训练

python - PLY 中的 IF 语句

python - PyInstaller设置流程说明