Байесовская нейронная сеть в тензорной вероятности - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок в tenorflow и пытаюсь настроить байесовскую нейронную сеть с плотными слоями flipout.Мой код выглядит следующим образом:

from tensorflow.keras.models import Sequential
import tensorflow_probability as tfp
import tensorflow as tf


def train_BNN(training_data, training_labels, test_data, test_labels, layers, epochs):

 bayesian_nn = Sequential()
 nbr_samples, dim = training_data.shape
 training_labels = training_labels.reshape((nbr_samples, 1))
 training_data = tf.convert_to_tensor(training_data, tf.float32)
 training_labels = tf.convert_to_tensor(training_labels, tf.float32)
 for i in range(0, len(layers)):
    bayesian_nn.add(tfp.layers.DenseFlipout(layers[i], activation='relu'))
 bayesian_nn.add(tfp.layers.DenseFlipout(1, activation='sigmoid'))

# Define loss function
 logits = bayesian_nn(training_data)
 neg_log_likelihood = tf.losses.sigmoid_cross_entropy(training_labels, logits=logits)
 kl = sum(bayesian_nn.losses)
 loss = neg_log_likelihood + kl
 # Define optimizer
 train_op = tf.train.AdamOptimizer().minimize(loss)
 bayesian_nn.compile(train_op, loss=loss, metrics=['accuracy'])

Я получаю следующую ошибку при попытке компиляции сети:

Traceback (most recent call last):
  File "./test_script.py", line 34, in <module>
    dataset[0:training,], labels[0:training], dataset[training:,], labels[training:], layers, epochs
  File "/home/e/bayesian_nn.py", line 34, in train_BNN
    bayesian_nn.compile(train_op, loss=loss, metrics=['accuracy'])
  File "/home/e/.pyenv/versions/kmer_profiling/lib/python3.6/site-packages/tensorflow/python/training/checkpointable/base.py", line 474, in _method_wrapper
    method(self, *args, **kwargs)
  File "/home/e/.pyenv/versions/kmer_profiling/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 405, in compile
    loss = loss or {}
  File "/home/e/.pyenv/versions/kmer_profiling/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 671, in __bool__
    raise TypeError("Using a `tf.Tensor` as a Python `bool` is not allowed. "
TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.

Я не знаю, что является причиной этой ошибки ... пожалуйста, помогите:)

1 Ответ

0 голосов
/ 09 марта 2019

Кажется, что loss, который вы передаете в model.compile, это tf.Tensor, что недопустимо.Глядя на документацию , кажется, что вы должны передавать функцию потерь (или строковое представление) напрямую, а не создавать ее сначала, т.е. loss=tf.losses.sigmoid_cross_entropy (или список потерь) вместо loss=tf.losses.sigmoid_cross_entropy(training_labels, logits=logits)

...