2016-04-28 13 views
7

मैं here दिखाए गए अनुसार एंड्रयू एनजी के व्याख्यान नोट्स के अनुसार स्पैस ऑटोनकोडर्स को लागू करने की कोशिश कर रहा हूं। यह आवश्यक है कि एक जुर्माना अवधि (के-एल विचलन) शुरू करके एक ऑटोकोडर परत पर एक स्पष्टीकरण बाधा लागू की जाए। मैंने कुछ मामूली परिवर्तनों के बाद, here प्रदान की गई दिशा का उपयोग करके इसे लागू करने का प्रयास किया। यहां के-एल विचलन और स्पैरएक्टिविटी रेग्युलरिज़र क्लास द्वारा लागू वर्णित दंड शब्द है जैसा कि नीचे दिखाया गया है।मैं केरास में कस्टम गतिविधि नियमित रूप से सही तरीके से कार्यान्वित कैसे करूं?

def kl_divergence(p, p_hat): 
return (p * K.log(p/p_hat)) + ((1-p) * K.log((1-p)/(1-p_hat))) 

class SparseActivityRegularizer(Regularizer): 
sparsityBeta = None 

    def __init__(self, l1=0., l2=0., p=-0.9, sparsityBeta=0.1): 
     self.p = p 
     self.sparsityBeta = sparsityBeta 

    def set_layer(self, layer): 
     self.layer = layer 

    def __call__(self, loss): 
     #p_hat needs to be the average activation of the units in the hidden layer.  
     p_hat = T.sum(T.mean(self.layer.get_output(True) , axis=0)) 

     loss += self.sparsityBeta * kl_divergence(self.p, p_hat) 
     return loss 

    def get_config(self): 
     return {"name": self.__class__.__name__, 
      "p": self.l1} 

मॉडल तो

X_train = np.load('X_train.npy') 
X_test = np.load('X_test.npy') 

autoencoder = Sequential() 
encoder = containers.Sequential([Dense(250, input_dim=576, init='glorot_uniform', activation='tanh', 
    activity_regularizer=SparseActivityRegularizer(p=-0.9, sparsityBeta=0.1))]) 

decoder = containers.Sequential([Dense(576, input_dim=250)]) 
autoencoder.add(AutoEncoder(encoder=encoder, decoder=decoder, output_reconstruction=True)) 
autoencoder.layers[0].build() 
autoencoder.compile(loss='mse', optimizer=SGD(lr=0.001, momentum=0.9, nesterov=True)) 
loss = autoencoder.fit(X_train_tmp, X_train_tmp, nb_epoch=200, batch_size=800, verbose=True, show_accuracy=True, validation_split = 0.3) 
autoencoder.save_weights('SparseAutoEncoder.h5',overwrite = True) 
result = autoencoder.predict(X_test) 

की तरह बनाया गया था जब मैं फिट() फ़ंक्शन को कॉल मैं नकारात्मक नुकसान मूल्यों को प्राप्त है और उत्पादन पर सभी इनपुट जैसा नहीं होता है। मैं जानना चाहता हूं कि मैं कहां गलत हो रहा हूं। परत की औसत सक्रियण की गणना करने और इस कस्टम स्पेर्सिटी नियमितकर्ता का उपयोग करने का सही तरीका क्या है? किसी भी तरह की मदद की सराहना की जाएगी। धन्यवाद!

मैं पाइथन 2.7 के साथ केरास 0.3.1 का उपयोग कर रहा हूं क्योंकि नवीनतम केरास (1.0.1) निर्माण में ऑटोकोडर परत नहीं है।

+0

https://stackoverflow.com/questions/47859737/keras-error-in-fit-method-expected-model-2-to-have-shape-none-252-252-1-b कोई सुझाव? –

उत्तर

0

आपने 0.05 मान के बजाय self.p = -0.9 परिभाषित किया है कि मूल पोस्टर और व्याख्यान नोट्स जिन्हें आप संदर्भित करते हैं, दोनों का उपयोग कर रहे हैं।

+0

https://stackoverflow.com/questions/47859737/keras-error-in-fit-method-expected-model-2-to-have-shape-none-252-252-1-b कोई सुझाव? –

संबंधित मुद्दे

 संबंधित मुद्दे