Я редактировал этот код многими способами, я пытаюсь реализовать сеть со смешанной плотностью, которая получает одномерный ввод и возвращает двумерный вывод.
Я действительно новичок в 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)
``````