zondag 22 maart 2020

Leren met letters 08 (83%) - Een eigen Keras layer

Vandaag heb ik mij verdiept in het maken van een echte eigen Keras layer. door de gekozen vaste structuur van mijn data heeft het model met chars2vec veel ruimte nodig om de data op te slaan. De v50 versie gaat prima, de v100 ook nog wel maar de v200 lijkt wel de limiet te zijn. Ik zou zo graag ook nog eens de V300 versie testen. Bert werkt tenslotte met 768 vectoren dus waarom ik niet met minstens 300 😀 ?



De oplossing zou mogelijk zijn om de chars2vec conversie als eerste layer in het model op te nemen. Dan bied ik gewoon de teksten aan als list en de eerste layer maakt er de mooie vector van gebaseerd op chars2vec.

Ik probeer deze eenvoudige 'class' toe te voegen:

class C2v(Layer):

  def __init__(self, units=batchsize, input=[]):
    super(C2v, self).__init__()

  def call(self, inputs):
    return conv_texts_c2v(inputs) 

De conv_texts_c2v splitst de input op in losse teksten en laat ze in conv_text_ch2v per tekt eerst wat opschonen rond tags en punctuaties en roept vervolgens het c2v_model.vectorize_words aan om alles om te zetten naar passende vectoren.
Na wat experimenteren lijkt de syntax in ieder geval goed. Helaas komt er een foutmelding dat dit zo niet is toegestaan:

tensorflow.python.framework.errors_impl.OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.

Ik probeer uiteraard de 'decorating optie' maar dat geeft helaas nog geen verbeteringen. Ook 'eager excecution', waar eerder naar verwezen wordt lijkt hier helaas niets te doen.
Het is mij nog niet duidelijk wat er nu precies fout gaat maar het lijkt te maken te hebben met de tensorflow graph-methode die bepaalde zaken niet toestaat.

Bij de keras embedding layer is het toch ook mogelijk om bijvoorbeeld pretrained word2vec te gebruiken. De code daarvan geeft mij helaas niet veel houvast. 


Geen opmerkingen:

Een reactie posten