Attempt to convert a value (None) with an unsupported type () to a Tensor

Что я хочу сделать: У меня есть две НС: generator и discriminator. Если они обе линейные то проблем с их объединением не возникает, но мне необходимо, чтобы discriminator имел два входа.

Что я делаю:

import tensorflow as tf
from tensorflow import keras
from keras import layers
from keras.models import Model, Sequential
from keras.layers import Input, InputLayer, Dense, Conv2D,Reshape, Flatten, Dropout, MaxPool2D
from keras.optimizers import Adam
import numpy as np

Создаю две сети:

inp_shape = (4,4,4)
inp_shape_2 = (16)
def get_optimizer():
    return Adam(learning_rate=0.0002, beta_1=0.5)

def get_generator(optimizer):
    generator = Sequential()
    generator.add(Conv2D(64,4,activation= 'relu', padding="same",input_shape = inp_shape))
    generator.add(Conv2D(32,4,activation= 'relu', padding="same"))
    generator.add(Conv2D(32,3,activation= 'relu', padding="same"))
    generator.add(MaxPool2D())
    generator.add(Conv2D(16,3,activation= 'relu', padding="same"))
    generator.add(Conv2D(8,3,activation= 'sigmoid', padding="same"))
    generator.add(Flatten())
    generator.add(Dense(1024))
    generator.add(Dropout(0.3))
    generator.add(Dense(256))
    generator.add(Dropout(0.2))
    generator.add(Dense(256))
    generator.add(Dropout(0.2))
    generator.add(Dense(16,activation = 'softmax'))
    generator.compile(loss='binary_crossentropy', optimizer=optimizer)
    return generator

def get_discriminator(optimizer):
    inp_1=tf.keras.layers.Input(inp_shape)
    inp_2=tf.keras.layers.Input(inp_shape_2)
    x = tf.keras.layers.Conv2D(32,4,activation='relu',padding='same')(inp_1)
    x = tf.keras.layers.Conv2D(16,3,activation='relu',padding='same')(x)
    x = tf.keras.layers.Conv2D(8,3,activation='relu',padding='same')(x)
    x =  tf.keras.layers.Flatten()(x)

    z_1 = tf.keras.layers.Dense(16)(x)
    z_2 =  tf.keras.layers.Flatten()(inp_2)

    z = tf.keras.layers.concatenate([z_1,z_2])
    z = tf.keras.layers.Dense(128)(z)
    z = tf.keras.layers.Dense(64)(z)
    z = tf.keras.layers.Dense(16)(z)
    out = tf.keras.layers.Dense(1)(z)
    discriminator=tf.keras.models.Model(inputs=[inp_1,inp_2], outputs=out)
    discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
    return discriminator

И пытаюсь их объединить:

def get_gan_network(generator, discriminator, optimizer):
    discriminator.trainable = False
    
    gan_input = Input(shape=(inp_shape), name='field_input')
    y = player_1(gan_input)
    gan_output = referee([gan_input,y])

    gan = Model(inputs=[gan_input,gan_input_2], outputs=gan2_output)
    gan.compile(loss='binary_crossentropy', optimizer=optimizer)
    return gan

adam = get_optimizer()
generator = get_generator_(adam)
discriminator= get_discriminator(adam)
gan = get_gan_network(generator , discriminator, adam)

На что получаю следующую ошибку:

Подчёркивается следующая строка:

gan1_output = referee([gan_input,y])

И выдаётся ошибка вида:

ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.

Это начало ошибки, может оно даст больше информации...

WARNING:tensorflow:
The following Variables were used a Lambda layer's call (tf.nn.convolution_4), but
are not present in its tracked objects:
  <tf.Variable 'conv2d_4/kernel:0' shape=(3, 3, 4, 64) dtype=float32>
It is possible that this is intended behavior, but it is more likely
an omission. This is a strong indication that this layer should be
formulated as a subclassed Layer rather than a Lambda layer.
WARNING:tensorflow:
The following Variables were used a Lambda layer's call (tf.nn.bias_add_4), but
are not present in its tracked objects:
  <tf.Variable 'conv2d_4/bias:0' shape=(64,) dtype=float32>
It is possible that this is intended behavior, but it is more likely
an omission. This is a strong indication that this layer should be
formulated as a subclassed Layer rather than a Lambda layer.
WARNING:tensorflow:
The following Variables were used a Lambda layer's call (tf.nn.convolution_5), but
are not present in its tracked objects:
  <tf.Variable 'conv2d_5/kernel:0' shape=(3, 3, 64, 128) dtype=float32>
It is possible that this is intended behavior, but it is more likely
an omission. This is a strong indication that this layer should be
formulated as a subclassed Layer rather than a Lambda layer.
WARNING:tensorflow:
The following Variables were used a Lambda layer's call (tf.nn.bias_add_5), but
are not present in its tracked objects:
  <tf.Variable 'conv2d_5/bias:0' shape=(128,) dtype=float32>
It is possible that this is intended behavior, but it is more likely
an omission. This is a strong indication that this layer should be
formulated as a subclassed Layer rather than a Lambda layer.
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-b3961e05d011> in <module>()
     89 player_2 = get_generator_2(adam)
     90 referee = get_discriminator(adam)
---> 91 gan_1 = get_gan1_network(player_1, referee, adam)
     92 gan_2 = get_gan2_network(player_2, referee, adam)
     93 keras.utils.plot_model(gan_1, show_shapes=True)

9 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/constant_op.py in convert_to_eager_tensor(value, ctx, dtype)
     96       dtype = dtypes.as_dtype(dtype).as_datatype_enum
     97   ctx.ensure_initialized()
---> 98   return ops.EagerTensor(value, ctx.device_name, dtype)
     99 
    100 

Я не много менял для упрощения вопроса разные переменные

player_1 - generator

player_2 - generator

referee - discriminator

gan_1 - GAN из pl_1 и ref

gan_2 - GAN из pl_2 и ref


Ответы (0 шт):