Денс eNet: график отключен: невозможно получить значение для тензора - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь создать Денс enet, но застрял со следующей ошибкой. Вот самый маленький пример для воспроизведения:

import tensorflow as tf
from tensorflow import keras
import tensorflow.keras.layers as tfkl

def create_model(input_dim):

    feature_list = list()
    input_x = tfkl.Input(shape=input_dim, name="Inputs")
    feature_list.append(input_x)
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv1")(input_x)
    feature_list.append(x)

    x = tfkl.Concatenate(axis=-1, name="Concat1")(feature_list)
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv2")(x)
    feature_list.append(x)
    x = tfkl.Concatenate(axis=-1, name="Concat2")(feature_list)

    return tf.keras.Model(inputs=input_x, outputs=x)

z = create_model((128,128,2))

Полученная ошибка:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("Conv2/Identity:0", shape=(None, 128, 128, 16), dtype=float32) at layer "Concat1". The following previous layers were accessed without issue: ['Inputs', 'Conv1']

Я не мог понять, что не так с этой моделью?

Идея использования feature_list заключается в том, что позже я могу создать плотный блок с переменным числом слоев свертки, то есть:

    for i in range(nb_layers):
          nb_filter += growth_rate
          x = tfkl.Concatenate(axis=-1)(feature_list)
          x = tfkl.Conv2D(nb_filter , kernel_size=(3, 3), padding="same")(x)
          feature_list.append(x)

Кроме того, если я закомментирую следующие две строки в функции create_model:

    #feature_list.append(x)
    #x = tfkl.Concatenate(axis=-1, name="Concat2")(feature_list)

, то модель будет работать без проблем (поэтому это означает, что в целом Concatenate работает правильно):

z.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
Inputs (InputLayer)             [(None, 128, 128, 2) 0                                            
__________________________________________________________________________________________________
Conv1 (Conv2D)                  (None, 128, 128, 16) 304         Inputs[0][0]                     
__________________________________________________________________________________________________
Concat1 (Concatenate)           (None, 128, 128, 18) 0           Inputs[0][0]                     
                                                                 Conv1[0][0]                      
__________________________________________________________________________________________________
Conv2 (Conv2D)                  (None, 128, 128, 16) 2608        Concat1[0][0]                    
==================================================================================================
Total params: 2,912
Trainable params: 2,912
Non-trainable params: 0
__________________________________________________________________________________________________

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Подумайте, что создание функциональной модели keras не проходит быстро, а списки - это просто ссылки. Поэтому, когда вы добавляете вывод Conv2 в список объектов, он также отражается в следующей строке: x = tfkl.Concatenate(axis=-1, name="Concat1")(feature_list), где у вас на самом деле нет выхода Conv2.

Что вам нужно сделать, это вызвать слой Concat с копия списка возможностей. Смотрите пример ниже:

import copy
import tensorflow as tf
from tensorflow import keras
import tensorflow.keras.layers as tfkl

def create_model(input_dim):

    feature_list = list()
    input_x = tfkl.Input(shape=input_dim, name="Inputs")
    feature_list.append(input_x)
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv1")(input_x)
    feature_list.append(x)

    x = tfkl.Concatenate(axis=-1, name="Concat1")(copy.copy(feature_list))
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv2")(x)
    feature_list.append(x)
    print(feature_list)
    x = tfkl.Concatenate(axis=-1, name="Concat2")(copy.copy(feature_list))

    return tf.keras.Model(inputs=input_x, outputs=x)

z = create_model((128,128,2))
0 голосов
/ 14 февраля 2020

Я думаю, что это из-за имен ваших слоев, вы пытаетесь объединить массив с одинаковыми именами слоев: [input_x, x, x], попробуйте это:

import tensorflow as tf
from tensorflow import keras
import tensorflow.keras.layers as tfkl

def create_model(input_dim):

    feature_list = list()
    input_x = tfkl.Input(shape=input_dim)
    feature_list.append(input_x)
    conv1 = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same")(input_x)
    feature_list.append(conv1)

    concat1 = tfkl.Concatenate(axis=-1)(feature_list)
    conv2 = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same")(concat1)
    feature_list.append(conv2)

    concat2 = tfkl.Concatenate(axis=-1)(feature_list)

    return tf.keras.Model(inputs=input_x, outputs=concat2)

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