2017-10-28 10 views
1

Dies ist ein Stück Code, den ich von github für hierarchisches Aufmerksamkeitsnetzwerk erhalte, der Code ist ursprünglich in Keras 1.2.2. Jetzt muss ich es ändern, um mit Keras 2.0.5 zu kompilieren, aber es hat solche Fehlermeldungen, die ich nicht lösen konnte.Warum der Keras-Code beim Wechsel von Keras 1.2.2 nach Keras 2.0.5 Fehlermeldungen erhält

Der ursprüngliche Code ist die folgenden

MAX_SENT_LENGTH = 100 
MAX_SENTS = 20 
MAX_NB_WORDS = 276176 
EMBEDDING_DIM = 128 
VALIDATION_SPLIT = 0.1 
# Feed the data 
# Here you have source data 

x_train = np.load('./data/X_full_train_data.npy') 
y_train = np.load('./data/X_full_train_labels.npy') 
x_val = np.load('./data/X_full_test_data.npy') 
y_val = np.load('./data/X_full_test_labels.npy') 

np.random.seed(10) 
shuffle_indices = np.random.permutation(np.arange(len(y_train))) 
x_train = x_train[shuffle_indices] 
y_train = y_train[shuffle_indices] 

shuffle_indices = np.random.permutation(np.arange(len(y_val))) 
x_val = x_train[shuffle_indices] 
y_val = y_train[shuffle_indices] 



with open("./data/W.npy", "rb") as fp: 
    embedding_weights = np.load(fp) 


# here you feed embeding matrix   
embedding_layer = Embedding(MAX_NB_WORDS, 
         EMBEDDING_DIM, 
         weights=[embedding_weights], 
         input_length=MAX_SENT_LENGTH, 
         trainable=True) 
# building Hierachical Attention network 

class AttLayer(Layer): 

    def __init__(self, **kwargs): 
     self.init = initializers.get('normal') 

     super(AttLayer, self).__init__(**kwargs) 

    def build(self, input_shape): 
     assert len(input_shape)==3 
     self.W = self.init((input_shape[-1],)) 
     self.trainable_weights = [self.W] 
     super(AttLayer, self).build(input_shape) 

    def call(self, x, mask=None): 

     eij = K.tanh(K.dot(x, self.W)) 

     ai = K.exp(eij) 
     weights = ai/K.sum(ai, axis=1).dimshuffle(0,'x') 
     weighted_input = x*weights.dimshuffle(0,1,'x') 
     ret = weighted_input.sum(axis=1) 
     return ret 

    #def get_output_shape_for(self, input_shape): 
    def compute_output_shape(self,input_shape): 

     return (input_shape[0], input_shape[-1]) 



sentence_input = Input(shape=(MAX_SENT_LENGTH,), dtype='int32') 
embedded_sequences = embedding_layer(sentence_input) 
l_lstm = Bidirectional(GRU(100, return_sequences=True))(embedded_sequences) 

l_dense = TimeDistributed(Dense(200))(l_lstm) 
l_att = AttLayer()(l_lstm) 
sentEncoder = Model(sentence_input, l_att) 
review_input = Input(shape=(MAX_SENTS,MAX_SENT_LENGTH), dtype='int32') 
review_encoder = TimeDistributed(sentEncoder)(review_input) 
l_lstm_sent = Bidirectional(GRU(100, return_sequences=True))(review_encoder) 
l_dense_sent = TimeDistributed(Dense(200))(l_lstm_sent) 
l_att_sent = AttLayer()(l_lstm_sent) 
preds = Dense(3, activation='softmax')(l_att_sent) 
model = Model(input=review_input, output=preds) 
model.compile(loss='binary_crossentropy', 
      optimizer='rmsprop', 
      metrics=['categorical_accuracy']) 

print("model fitting - Hierachical attention network") 
print(model.summary()) 

model.fit(x_train, y_train, nb_epoch=10, batch_size=32, validation_data=(x_val,y_val)) 

predictions = model.predict(x_val) 
score, acc = model.evaluate(x_val, y_val,batch_size=32) 

Dann habe ich die folgenden Fehler

textClassifierHATT.py:235: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`. 

model.fit(x_train, y_train, nb_epoch=10, batch_size=32, validation_data=(x_val,y_val)) 


Traceback (most recent call last): 
    File "textClassifierHATT.py", line 235, in <module> 
    model.fit(x_train, y_train, nb_epoch=10, batch_size=32, validation_data=(x_val,y_val)) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 1575, in fit 
    self._make_train_function() 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 960, in _make_train_function 
    loss=self.total_loss) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 87, in wrapper 
    return func(*args, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/optimizers.py", line 226, in get_updates 
    accumulators = [K.zeros(K.int_shape(p), dtype=K.dtype(p)) for p in params] 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/optimizers.py", line 226, in <listcomp> 
    accumulators = [K.zeros(K.int_shape(p), dtype=K.dtype(p)) for p in params] 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/backend/theano_backend.py", line 275, in int_shape 
    raise TypeError('Not a Keras tensor:', x) 
TypeError: ('Not a Keras tensor:', Elemwise{add,no_inplace}.0) 

das keras Modell erfolgreich in model.compile kompilieren(), aber es hat Fehler in model.fit(), Ich verstehe überhaupt nicht, warum ein solcher Fehler existiert. jeder kann mir sagen, wie man es ändert, damit es mit keras 2.0 laufen kann. Vielen Dank.

+0

Was die Form Ihrer Daten ist –

+0

@JulioDanielReyes Die Form der Daten ist nur numpy arrary mit (Trainsize, Abmessungen) und (Trainsize, Label). –

Antwort

1

Das Problem ist auf der Build-Methode der benutzerdefinierte Schicht, nach keras' documentation, müssen Sie die Gewichte mit der self.add_weight Funktion erstellen:

def build(self, input_shape): 
     assert len(input_shape)==3 
     self.W = self.add_weight(name='kernel', 
             shape=(input_shape[-1],), 
             initializer='normal', 
             trainable=True) 
     super(AttLayer, self).build(input_shape) 

Das und ein paar API-Änderungen:

  • Parameter input und output in Model(inputs=.., outputs=..) geändert
  • Die nb_epochs Parameter in fit jetzt genannt wird, epochs