TypeError: 'int' object is not iterable while training a neural network

TypeError: 'int' object is not iterable while training a neural network

我正在尝试训练 NeRF (https://github.com/bmild/nerf),下面是我遇到的错误。我试图打印变量的数据类型。不知道下一步怎么办。

这是一个代码片段:

在run_nerf_helpers.py中:

def init_nerf_model(D=8, W=256, input_ch=3, input_ch_views=3, output_ch=4, skips=[4], use_viewdirs=False):

    relu = tf.keras.layers.ReLU()
    def dense(W, act=relu): return tf.keras.layers.Dense(W, activation=act)

    print('MODEL', input_ch, input_ch_views, type(
        input_ch), type(input_ch_views), use_viewdirs)
    input_ch = int(input_ch)
    input_ch_views = int(input_ch_views)

    inputs = tf.keras.Input(shape=(input_ch + input_ch_views))
    inputs_pts, inputs_views = tf.split(inputs, [input_ch, input_ch_views], -1)
    inputs_pts.set_shape([None, input_ch])
    inputs_views.set_shape([None, input_ch_views])

    print(inputs.shape, inputs_pts.shape, inputs_views.shape)
    outputs = inputs_pts
    for i in range(D):
        outputs = dense(W)(outputs)
        if i in skips:
            outputs = tf.concat([inputs_pts, outputs], -1)

在run_nerf.py

def create_nerf(args):
    """Instantiate NeRF's MLP model."""

    embed_fn, input_ch = get_embedder(args.multires, args.i_embed)

    input_ch_views = 0
    embeddirs_fn = None
    if args.use_viewdirs:
        embeddirs_fn, input_ch_views = get_embedder(
            args.multires_views, args.i_embed)
    output_ch = 4
    skips = [4]
    model = init_nerf_model(
        D=args.netdepth, W=args.netwidth,
        input_ch=input_ch, output_ch=output_ch, skips=skips,
        input_ch_views=input_ch_views, use_viewdirs=args.use_viewdirs)
    grad_vars = model.trainable_variables
    models = {'model': model}

def create_nerf(args):
    """Instantiate NeRF's MLP model."""

    embed_fn, input_ch = get_embedder(args.multires, args.i_embed)

    input_ch_views = 0
    embeddirs_fn = None
    if args.use_viewdirs:
        embeddirs_fn, input_ch_views = get_embedder(
            args.multires_views, args.i_embed)
    output_ch = 4
    skips = [4]
    model = init_nerf_model(
        D=args.netdepth, W=args.netwidth,
        input_ch=input_ch, output_ch=output_ch, skips=skips,
        input_ch_views=input_ch_views, use_viewdirs=args.use_viewdirs)
    grad_vars = model.trainable_variables
    models = {'model': model}

错误:

('input_ch_views:', <type 'int'>)
('output_ch:', <type 'int'>)
('use_viewdirs:', <type 'bool'>)
('MODEL', 63, 27, <type 'int'>, <type 'int'>, True)

Traceback (most recent call last):
  File "run_nerf.py", line 938, in <module>
    train()
  File "run_nerf.py", line 682, in train
    args)
  File "run_nerf.py", line 397, in create_nerf
    input_ch_views=input_ch_views, use_viewdirs=args.use_viewdirs)
  File "/home/nerf-master/run_nerf_helpers.py", line 90, in init_nerf_model
    inputs = tf.keras.Input(shape=(input_ch + input_ch_views))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/keras/engine/input_layer.py", line 231, in Input
    input_tensor=tensor)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/keras/engine/input_layer.py", line 91, in __init__
    batch_input_shape = (batch_size,) + tuple(input_shape)
TypeError: 'int' object is not iterable

我是新手。任何帮助将非常感激。谢谢:)

在科学图书馆中,努力在算法上,而不是在类型检查上。所以传递的参数不像在基础包中那样检查,错误大部分时间在用户代码中,但它在库代码本身的深处崩溃,这使得它更难理解。

所以你必须跟踪回溯到错误所在的代码。您的代码的下层堆栈框架是:

inputs = tf.keras.Input(shape=(input_ch + input_ch_views))

Input 形状参数是:一个形状元组(整数),不包括批量大小。

(input_ch + input_ch_views) 没有定义 tuple。要定义内部只有一个元素的元组,您需要添加尾随 ,

inputs = tf.keras.Input(shape=(input_ch + input_ch_views,))

参考:How to create a tuple with only one element