Ejemplo n.º 1
0
class sae(object):
    def __init__(self, n_sample=80, n_class=2, hidden=[200,200]):
        self.n_in = n_sample
        self.n_out = n_class
        self.hidden = hidden
        
    def train(self, train_x, train_y, batch_size=10, pre_epoch=10, 
              fine_epoch=50, dropout=0.5, regularizer_l2=1e-3, split=0.0):
        self.batch_size = batch_size
        self.p = dropout
        self.l2 = regularizer_l2
        struct = [self.n_in] + self.hidden
#        nb_epoch = pre_epoch
        
        ##  Pre-training autoencoders
        encoder = Sequential()
        encoder.add(Dense(self.hidden[0], input_dim=self.n_in, activation='tanh', W_regularizer=l2(self.l2)))
        encoder.add(Dropout(self.p))
        for n_out in self.hidden[1:]:
            encoder.add(Dense(n_out, activation='tanh', W_regularizer=l2(self.l2)))
            encoder.add(Dropout(self.p))
            
        decoder = Sequential()
        decoder.add(Dense(self.hidden[-2], input_dim=self.hidden[-1], activation='tanh', W_regularizer=l2(self.l2)))
        decoder.add(Dropout(self.p))
#        for n_in in struct[-(len(self.hidden)+1)::-1]:
        for n_in in struct[-3::-1]:
            decoder.add(Dense(n_in, activation='tanh', W_regularizer=l2(self.l2)))
            decoder.add(Dropout(self.p))
        autoencoder = AutoEncoder(encoder=encoder, decoder=decoder, output_reconstruction=True)
        ae = Sequential()
        ae.add(autoencoder)
        pre_optimizer = Adagrad(lr=0.01, epsilon=1e-6)
        ae.compile(loss='mse', optimizer=pre_optimizer)
        ae.fit(train_x, train_x, nb_epoch=pre_epoch, batch_size=self.batch_size)
        
        ##  fine-tuning
        print 'Fine-tuning the network:'
        self.model = Sequential()
        self.model.add(ae.layers[0].encoder)
        self.model.add(Dense(self.n_out, activation='softmax'))
        fine_optimizer = Adagrad(lr=0.01, epsilon=1e-6)
        self.model.compile(loss='categorical_crossentropy', optimizer=fine_optimizer)
#        self.early_stopping = EarlyStopping(patience=20, monitor='val_loss')
#        self.check_point = ModelCheckpoint(filepath='./tmp/weights.hdfs', save_best_only=True)
        self.history = History()
#        nb_epoch = fine_epoch
        self.model.fit(train_x, train_y, nb_epoch=fine_epoch, batch_size=self.batch_size, 
                       validation_split=split,
                       callbacks=[self.history])  ##self.check_point, ,self.early_stopping
        return self.model
        
    def predict(self, x):
        return self.model.predict_probs(x)