2017-10-28 113 views
1

这是我从github获得的关于等级关注网络的代码片段,代码最初是在Keras 1.2.2中。现在我不得不改变它与Keras 2.0.5编译,但是,它有这样的错误信息,我无法解决。为什么keras代码在从Keras 1.2.2更改为Keras 2.0.5时得到错误消息

原代码如下

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) 

然后,我有以下错误

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) 

的keras模型model.compile()成功地进行编译,但它在model.fit错误(),我完全不明白为什么会出现这样的错误。任何人都可以告诉我如何修改它,以便它可以与keras 2.0一起运行非常感谢。

+0

什么是你的数据的形状 –

+0

@JulioDanielReyes数据的形状只是numpy的arrary(Trainsize,尺寸)和(Trainsize,标签)。 –

回答

1

的问题是在您的自定义层的构建方法,根据keras' documentation,你需要与self.add_weight功能创建的权重:

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) 

这和一些API的变化:

  • 参数inputoutput已更改Model(inputs=.., outputs=..)
  • 现在调用fit中的nb_epochs参数epochs