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)