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