Tensorflow Невозможно получить значение в функции графа Tensorflow - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь реализовать модель нейронной сети с TensorFlow для классификации текста. Я создал пользовательский слой, чтобы рассчитать средневзвешенное значение и узнать весовые коэффициенты, но продолжаю получать эту странную ошибку, которая говорит: «Невозможно получить значение внутри функции графика Tensorflow». Вот что я кодировал до сих пор (Для небольших образцов текстов просто для тестирования). Это мой пользовательский слой:

from tensorflow.keras import layers
import tensorflow as tf
import numpy as np


class WeightedAverageLayer(layers.Layer):

    def __init__(self, vocab_size, embedding_dimension, doc_length):
        super(WeightedAverageLayer, self).__init__()

        self.embedding_dimension = embedding_dimension
        self.vocab_size = vocab_size
        self.doc_length = doc_length

        #Initialize the embedding layer
        self.embedding_layer = tf.keras.layers.Embedding(vocab_size, embedding_dimension, input_length=doc_length)

        #Initialize the words importance
        b_init = tf.zeros_initializer()
        self.b = self.add_weight(shape=(vocab_size,), initializer='random_normal', trainable=True)

    def calculate_average(self, doc):
        doc_words = self.embedding_layer(doc)
        word_embeddings = self.embedding_layer.get_weights()[0]
        s = 0
        avg = 0
        z = np.zeros((self.embedding_dimension))
        for i in range(self.embedding_dimension):
            for j in range(len(doc)):
                val = doc[j]
                vw = word_embeddings[val]
                a = self.b[val]
                s = s + vw[i] * a
            avg = s / len(doc)
            z[i] = avg
            s = 0
            avg = 0
        return z


    def call(self, docs):
        result = []
        for doc in docs:
            vect = self.calculate_average(doc)
            result.append(vect)
        result_np = np.array(result)
        return tf.stack(result_np)
        #return list(map(self.calculate_average, docs))

и это основной файл, в котором я тестирую свой слой в модели:

vocab_size = 20
embedding_dim = 10
max_length = 4

# define documents
docs = ['Well done!', 'Good work', 'Great effort', 'nice work', 'Excellent!', 
'Weak', 'Poor effort!', 'not good', 'poor work', 'Could have done better.', 'You are amazing']
# define class labels
labels = np.array([[1,0],[1,0],[1,0],[1,0],[1,0],[0,2],[0,2],[0,2],[0,2],[0,2],[1,0]])

tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(docs)
word_index = tokenizer.word_index

sequences = tokenizer.texts_to_sequences(docs)
pad = pad_sequences(sequences, maxlen=max_length, padding="post")

average_layer = WeightedAverageLayer(vocab_size, embedding_dim, max_length )
output_layer = tf.keras.layers.Dense(2, activation='softmax')

input_docs = Input(shape=(max_length))
weighted_average = average_layer(input_docs)
output = output_layer(weighted_average)
model = Model(input_docs, output)

Обратите внимание, что я тестировал один слой, и он работал хорошо.

...