генеративные модели с tpu_estimator тензорного потока ()? - PullRequest
0 голосов
/ 30 июня 2018

Можно ли обучить генеративную модель (то есть вариационный автоэнкодер с пользовательским расчетом потерь) с помощью tpu_estimator () tenorflow?

Упрощенная версия моего VAE:

Модель Функция

def model_fn(features, labels, mode, params): 
  #Encoder layers  
  x = layers.Input()  
  h = conv1D()(x)  
  #BOTTLENECK LAYER  
  z_mean = Dense()(h)  
  z_log_var = Dense()(h)  
  def sampling(args):  
    z_mean_, z_log_var_ = args  
    epsilon = tf.random_normal()  
    return z_mean_ + tf.exp(z_log_var_/2)*epsilon  
  z = Lambda(sampling, name='lambda')([z_mean, z_log_var])
  #Decoder Layers
  h = Dense(z)
  x_decoded = TimeDistributed(Dense(activation='softmax'))(h)
  #VAE
  vae = tf.keras.models.Model(x, x_decoded)
  #VAE LOSS
  def vae_loss(x,x_decoded_mean):
    x = flatten(x)
    x_decoded_mean = flatten(x_decoded_mean)
    xent_loss = binary_crossentropy(x, x_decoded_mean)
    kl_loss = mean(1 + z_log_var - square(z_mean) - exp(z_log_var))
    return xent_loss + kl_loss
  optimizer = tf.train.AdamOptimizer()
  optimizer = tpu_optimizer.CrossShardOptimizer(optimizer)
  train_op = optimizer.minimize(vae_loss, global_step=tf.train.get_global_step())
  return tpu_estimator.TPUEstimatorSpec(mode=mode, loss=vae_loss, train_op=train_op)

Конфигурация TPU инициализируется, и набор данных загружается должным образом с моим input_fn, но появляется следующая ошибка, которая вызывается пользовательской функцией потерь:

VAE_LOSS() error:

File "TPUest.py", line 107, in model_fn
train_op = optimizer.minimize(vae_loss, global_step=tf.train.get_global_step())
File "/usr/local/lib/python2.7/dist- packages/tensorflow/python/training/optimizer.py", line 414, in minimize grad_loss=grad_loss)
File "/usr/local/lib/python2.7/distpackages/tensorflow/contrib/tpu/python/tpu/tpu_optimizer.py", line 84, in compute_gradients
loss *= scale
TypeError: unsupported operand type(s) for *=: 'function' and 'float'

1 Ответ

0 голосов
/ 01 сентября 2018

Вызов на optimizer.minimize должен иметь потерю Tensor , но вы передали функцию Python (которая с соответствующими входными данными оценивает то, что вы хотите). Смотри https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer#minimize

Что вам нужно сделать, так это явно построить тензор vae_loss в приведенном выше коде. Во время выполнения данные будут распространяться от вашего входного слоя до этого расчета потерь.

...