График отключен: невозможно получить значение для тензорного Tensor () на слое "input_1" - PullRequest
1 голос
/ 11 апреля 2020

Код для этой проблемы довольно сложный, потому что я пытаюсь реализовать фракт lNet, но меняю базовый блок свертки просто на плотный слой. Я пытаюсь отдельно построить две фрактальные сети (одну за другой, поэтому я не думаю, что они должны мешать). Один для политики и один для функции значения.

Есть также ряд проблем, которые я видел до сих пор, которые могут быть или не быть связаны. Во-первых, я не могу импортировать numpy как np и использовать np, поэтому я был вынужден использовать numpy (). Другая причина в том, что мой код пытается работать с тензорами tf.Tensor[stuff] и Tensor[stuff] в разных разделах одновременно. Функция build_model ниже выводит Tensor[stuff] из вызова Input, тогда как код построителя нейронной сети использует tf.Tensor[stuff]. Я пытался, но безрезультатно придерживаться типа.

Вот полная ошибка, которая продолжает убивать код:

/home/ryan/.local/lib/python3.6/site-packages/keras/engine/network.py:190: UserWarning: Model inputs must come from `keras.layers.Input` (thus holding past layer metadata), they cannot be the output of a previous non-Input layer. Here, a tensor specified as input to your model was not an Input tensor, it was generated by layer activation_1.
Note that input tensors are instantiated via `tensor = keras.layers.Input(shape)`.
The tensor that caused the issue was: activation_1/Relu:0
  str(x.name))
Traceback (most recent call last):
  File "train.py", line 355, in <module>
    main(**vars(args))
  File "train.py", line 302, in main
    val_func = NNValueFunction(bl,c,layersizes,dropout,deepest,obs_dim) # Initialize the value function
  File "/home/ryan/trpo_fractalNN/trpo/value.py", line 37, in __init__
    self.model = self._build_model()
  File "/home/ryan/trpo_fractalNN/trpo/value.py", line 56, in _build_model
    model = Model(inputs=obs_input, outputs=outputs)
  File "/home/ryan/.local/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/home/ryan/.local/lib/python3.6/site-packages/keras/engine/network.py", line 94, in __init__
    self._init_graph_network(*args, **kwargs)
  File "/home/ryan/.local/lib/python3.6/site-packages/keras/engine/network.py", line 241, in _init_graph_network
    self.inputs, self.outputs)
  File "/home/ryan/.local/lib/python3.6/site-packages/keras/engine/network.py", line 1511, in _map_graph_network
    str(layers_with_complete_input))
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(None, 29), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []

Итак, вот часть кода, в которой я сейчас подозреваю, из-за того, что каким-то образом ломается в самом начале нейронной функции значения net.

def _build_model(self):
    """ Construct TensorFlow graph, including loss function, init op and train op """
    # hid1 layer size is 10x obs_dim, hid3 size is 10, and hid2 is geometric mean
    # hid3_units = 5  # 5 chosen empirically on 'Hopper-v1'
    # hid2_units = int(np.sqrt(hid1_units * hid3_units))
    # heuristic to set learning rate based on NN size (tuned on 'Hopper-v1')

    obs = keras.layers.Input(shape=(self.obs_dim,))
    # I'm not sure why it won't work with np??????????????????????????????????????????????????????????????????????????????????
    obs_input = Dense(int(self.layersizes[0][0].numpy()))(obs) # Initial fully-connected layer that brings obs number up to a len that will work with fractal architecture
    obs_input = Activation('relu')(obs_input)
    self.lr = 1e-2 / np.sqrt(self.layersizes[2][0])  # 1e-2 empirically determined
    print('Value Params -- lr: {:.3g}'
          .format(self.lr))
    outputs = fractal_net(self,bl=self.bl,c=self.c,layersizes=self.layersizes,
        drop_path=0.15,dropout=self.dropout,
        deepest=self.deepest)(obs_input)
    model = Model(inputs=obs_input, outputs=outputs)
    optimizer = Adam(self.lr)
    model.compile(optimizer=optimizer, loss='mse')



    return model

1 Ответ

0 голосов
/ 13 апреля 2020

Я выяснил проблему. Проблема заключалась в том, что, поскольку я пытался объединить несколько файлов, у меня был «плотный» вызов, чтобы привести obs_len к желаемому размеру, а затем взял его и вставил в код fracta lNet. Однако я не понимал, что это сломает вещи. Я решил эту проблему, удалив исходный вызов Dense и поместив его внутри самого кода fracta lNet.

Итак, мораль этой истории - не пытайтесь разбить разные части слоев NN на отдельные файлы. , В качестве дополнительного комментария, в текущем коде fractalNN он вызывает фрактал _net, а затем слой Dense, и, очевидно, это все еще работает. Но я думаю, что это ломает вещи, пытаясь изменить этот порядок. Я надеюсь, что это помогает кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...