Объект NoneType не вызывается - MDN с керасом и обратным распространением - PullRequest
0 голосов
/ 09 октября 2019

Я редактировал этот код многими способами, я пытаюсь реализовать сеть со смешанной плотностью, которая получает одномерный ввод и возвращает двумерный вывод.
Я действительно новичок в tenorflow, поэтомуЯ очень ценю вашу помощь. Каждый раз, когда я пытаюсь это сделать, что-то идет не так. Теперь он дает мне эту ошибку: Ошибка типа: в преобразованном коде:

<ipython-input-127-593edcacdfbd>:6 train_step  *
    mdn_loss = mdn_loss_func(output_dim, num_mixes, x_true, y_true)
<ipython-input-124-785c7bda58fa>:3 mdn_loss_func  *
    y_pred = mdn_model(x_true)
C:\ProgramData\Anaconda3\lib\site-packages\tensorflow_core\python\autograph\impl\api.py:396 converted_call
    return py_builtins.overload_of(f)(*args)

TypeError: 'NoneType' object is not callable

Может кто-нибудь, пожалуйста, помогите мне? Вот мой код

def mdn_model():
input = tf.keras.Input(shape=(INPUT_DIMS,))
    layer = tf.keras.layers.Dense(N_HIDDEN, activation='tanh', name='baselayer' (input)
    mu = tf.keras.layers.Dense((OUTPUT_DIMS * N_MIXES), activation=None, name='mean_layer')(layer)
    var_layer = tf.keras.layers.Dense(OUTPUT_DIMS * N_MIXES, activation=None, name='dense_var_layer')(layer)
    var = tf.keras.layers.Lambda(lambda x: tf.math.exp(x), output_shape=(OUTPUT_DIMS * N_MIXES,), name='variance_layer')(var_layer)
    pi = tf.keras.layers.Dense(N_MIXES, activation='softmax', name='pi_layer')(layer)

Вот как определена функция потерь:

def mdn_loss_func(output_dim, num_mixes, x_true, y_true):

        y_pred = mdn_model(x_true)
        print('y_pred shape is {}'.format(y_pred.shape))
        y_pred = tf.reshape(y_pred, [-1, (2 * num_mixes * output_dim) + num_mixes], name='reshape_ypreds')
        y_true = tf.reshape(y_true, [-1, output_dim], name='reshape_ytrue')

        out_mu, out_sigma, out_pi = tf.split(y_pred, num_or_size_splits=[num_mixes * output_dim,
                                                                         num_mixes * output_dim,
                                                                         num_mixes],
                                             axis=-1, name='mdn_coef_split')
        # Construct the mixture models
        cat = tfd.Categorical(logits=out_pi)
        component_splits = [output_dim] * num_mixes
        mus = tf.split(out_mu, num_or_size_splits=component_splits, axis=1)
        sigs = tf.split(out_sigma, num_or_size_splits=component_splits, axis=1)
        coll = [tfd.MultivariateNormalDiag(loc=loc, scale_diag=scale) for loc, scale
                in zip(mus, sigs)]
        mixture = tfd.Mixture(cat=cat, components=coll)
        loss = mixture.log_prob(y_true)
        loss = tf.negative(loss)
        loss = tf.reduce_mean(loss)
        return loss

Я использовал Adam Optimizer из Кераса:

mdn_optimizer = tf.keras.optimizers.Adam(1e-4)
@tf.function
def train_step(x_true, y_true, output_dim, num_mixes):

    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:

      mdn_loss = mdn_loss_func(output_dim, num_mixes, x_true, y_true)

    gradients_of_mdn = gen_tape.gradient(mdn_loss, mdn_model.trainable_variables)

    mdn_optimizer.apply_gradients(zip(gradients_of_mdn, mdn_model.trainable_variables))

Затем я тренирую это так:

def train(dataset, output_dim, num_mixes, epochs):
  for epoch in range(epochs):
    start = time.time()

    for x_true, y_true in dataset:
      train_step(x_true, y_true, output_dim, num_mixes)

    print ('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start))


  display.clear_output(wait=True)
%%time
train(train_dataset, OUTPUT_DIMS, N_MIXES, EPOCHS)
``````
...