def testCNN(self): conf_filename = './sentiment_cnn.conf' # Build the architecture of CNN start_time = time.time() configer = CNNConfiger(conf_filename) convnet = ConvNet(configer, verbose=True) end_time = time.time() pprint('Time used to build the architecture of CNN: %f seconds' % (end_time - start_time)) # Training learn_rate = 0.5 batch_size = configer.batch_size num_batches = self.train_size / batch_size start_time = time.time() for i in xrange(configer.nepoch): right_count = 0 tot_cost = 0 # rate = learn_rate rate = learn_rate / (i / 100 + 1) for j in xrange(num_batches): minibatch = self.senti_train_set[j * batch_size:(j + 1) * batch_size, :] minibatch = minibatch.reshape( (batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_train_label[j * batch_size:(j + 1) * batch_size] cost, accuracy = convnet.train(minibatch, label, rate) prediction = convnet.predict(minibatch) right_count += np.sum(label == prediction) tot_cost += cost # pprint('Epoch %d, batch %d, cost = %f, local accuracy: %f' % (i, j, cost, accuracy)) accuracy = right_count / float(self.train_size) pprint('Epoch %d, total cost: %f, overall accuracy: %f' % (i, tot_cost, accuracy)) ConvNet.save('./sentiment.cnn', convnet) end_time = time.time() pprint( 'Time used to train CNN on Sentiment analysis task: %f minutes.' % ((end_time - start_time) / 60)) # Test num_batches = self.test_size / batch_size right_count = 0 for i in xrange(num_batches): minibatch = self.senti_test_set[i * batch_size:(i + 1) * batch_size, :] minibatch = minibatch.reshape( (batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_test_label[i * batch_size:(i + 1) * batch_size] prediction = convnet.predict(minibatch) right_count += np.sum(prediction == label) test_accuracy = right_count / float(self.test_size) pprint('Test set accuracy: %f' % test_accuracy)
def testCNN(self): conf_filename = './sentiment_cnn.conf' # Build the architecture of CNN start_time = time.time() configer = CNNConfiger(conf_filename) convnet = ConvNet(configer, verbose=True) end_time = time.time() pprint('Time used to build the architecture of CNN: %f seconds' % (end_time-start_time)) # Training learn_rate = 0.5 batch_size = configer.batch_size num_batches = self.train_size / batch_size start_time = time.time() for i in xrange(configer.nepoch): right_count = 0 tot_cost = 0 # rate = learn_rate rate = learn_rate / (i/100+1) for j in xrange(num_batches): minibatch = self.senti_train_set[j*batch_size : (j+1)*batch_size, :] minibatch = minibatch.reshape((batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_train_label[j*batch_size : (j+1)*batch_size] cost, accuracy = convnet.train(minibatch, label, rate) prediction = convnet.predict(minibatch) right_count += np.sum(label == prediction) tot_cost += cost # pprint('Epoch %d, batch %d, cost = %f, local accuracy: %f' % (i, j, cost, accuracy)) accuracy = right_count / float(self.train_size) pprint('Epoch %d, total cost: %f, overall accuracy: %f' % (i, tot_cost, accuracy)) ConvNet.save('./sentiment.cnn', convnet) end_time = time.time() pprint('Time used to train CNN on Sentiment analysis task: %f minutes.' % ((end_time-start_time)/60)) # Test num_batches = self.test_size / batch_size right_count = 0 for i in xrange(num_batches): minibatch = self.senti_test_set[i*batch_size : (i+1)*batch_size, :] minibatch = minibatch.reshape((batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_test_label[i*batch_size : (i+1)*batch_size] prediction = convnet.predict(minibatch) right_count += np.sum(prediction == label) test_accuracy = right_count / float(self.test_size) pprint('Test set accuracy: %f' % test_accuracy)
test_label = test_label[test_rand_shuffle] # Partition data based on batch size batch_size = configer.batch_size image_row = configer.image_row image_col = configer.image_col nepoch = configer.nepoch num_batches = training_size / batch_size start_time = time.time() for i in xrange(nepoch): for j in xrange(num_batches): minibatch = training_set[j*batch_size : (j+1)*batch_size, :] minibatch = minibatch.reshape((batch_size, 1, image_row, image_col)) label = training_label[j*batch_size : (j+1)*batch_size] cost, accuracy = convnet.train(minibatch, label) pprint('Epoch %d, batch %d, cost = %f, accuracy = %f' % (i, j, cost, accuracy)) ConvNet.save('./mnist.cnn', convnet) end_time = time.time() pprint('Time used to train CNN on MNIST: %f minutes' % ((end_time-start_time) / 60)) # Test accuracy num_batches = test_size / batch_size right_count = 0 for i in xrange(num_batches): minibatch = test_set[i*batch_size : (i+1)*batch_size] label = test_label[i*batch_size : (i+1)*batch_size] minibatch = minibatch.reshape((batch_size, 1, image_row, image_col)) prediction = convnet.predict(minibatch) right_count += np.sum(prediction == label) test_accuracy = right_count / float(test_size) pprint('Test set accuracy: %f' % test_accuracy)
def testCNNwithFineTuning(self): ''' Test the performance of CNN with fine-tuning the word-embedding. ''' pprint('CNN with fine-tuning experiment') conf_filename = './sentiment_cnn.conf' # Build the architecture of CNN start_time = time.time() configer = CNNConfiger(conf_filename) convnet = ConvNet(configer, verbose=True) end_time = time.time() pprint('Time used to build the architecture of CNN: %f seconds' % (end_time - start_time)) # Training learn_rate = 1 batch_size = configer.batch_size num_batches = self.train_size / batch_size start_time = time.time() # Define function to do the fine-tuning grad_to_input = T.grad(convnet.cost, convnet.input) compute_grad_to_input = theano.function( inputs=[convnet.input, convnet.truth], outputs=grad_to_input) # Begin training and fine-tuning the word-embedding matrix for i in xrange(configer.nepoch): right_count = 0 tot_cost = 0 # rate = learn_rate rate = learn_rate / (i / 100 + 1) for j in xrange(num_batches): # Record the information of each minibatch minibatch_len = list() minibatch_indices = list() # Dynamically building training matrix using current word-embedding matrix minibatch_txt = self.senti_train_txt[j * batch_size:(j + 1) * batch_size] minibatch = np.zeros( (batch_size, self.word_embedding.embedding_dim()), dtype=floatX) for k, txt in enumerate(minibatch_txt): words = txt.split() words = [word.lower() for word in words] vectors = np.asarray( [self.word_embedding.wordvec(word) for word in words]) minibatch[k, :] = np.mean(vectors, axis=0) # Record the length of each sentence minibatch_len.append(len(words)) # Record the index of each word in each sentence minibatch_indices.append([ self.word_embedding.word2index(word) for word in words ]) # Reshape into the form of input to CNN minibatch = minibatch.reshape( (batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_train_label[j * batch_size:(j + 1) * batch_size] # Training cost, accuracy = convnet.train(minibatch, label, rate) prediction = convnet.predict(minibatch) right_count += np.sum(label == prediction) tot_cost += cost # Fine-tuning for word-vector matrix grad_minibatch = compute_grad_to_input(minibatch, label) grad_minibatch = grad_minibatch.reshape( (batch_size, self.word_embedding.embedding_dim())) # Updating the word2vec matrix minibatch_len = np.asarray(minibatch_len) grad_minibatch /= minibatch_len[:, np.newaxis] for k, indices in enumerate(minibatch_indices): for l in indices: self.word_embedding._embedding[ l, :] -= 0.01 * rate * grad_minibatch[k, :] accuracy = right_count / float(self.train_size) pprint('Epoch %d, total cost: %f, overall accuracy: %f' % (i, tot_cost, accuracy)) if (i + 1) % 100 == 0: ConvNet.save('./sentiment.cnn', convnet) end_time = time.time() pprint( 'Time used to train CNN on Sentiment analysis task: %f minutes.' % ((end_time - start_time) / 60)) # Test num_batches = self.test_size / batch_size right_count = 0 for i in xrange(num_batches): minibatch_txt = self.senti_test_txt[i * batch_size:(i + 1) * batch_size] minibatch = np.zeros( (batch_size, self.word_embedding.embedding_dim()), dtype=floatX) for j, txt in enumerate(minibatch_txt): words = txt.split() words = [word.lower() for word in words] vectors = np.asarray( [self.word_embedding.wordvec(word) for word in words]) minibatch[j, :] = np.mean(vectors, axis=0) # Reshape into the form of input to CNN minibatch = minibatch.reshape( (batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_test_label[i * batch_size:(i + 1) * batch_size] prediction = convnet.predict(minibatch) right_count += np.sum(prediction == label) test_accuracy = right_count / float(self.test_size) pprint('Test set accuracy: %f' % test_accuracy)
def testCNNwithFineTuning(self): ''' Test the performance of CNN with fine-tuning the word-embedding. ''' pprint('CNN with fine-tuning experiment') conf_filename = './sentiment_cnn.conf' # Build the architecture of CNN start_time = time.time() configer = CNNConfiger(conf_filename) convnet = ConvNet(configer, verbose=True) end_time = time.time() pprint('Time used to build the architecture of CNN: %f seconds' % (end_time-start_time)) # Training learn_rate = 1 batch_size = configer.batch_size num_batches = self.train_size / batch_size start_time = time.time() # Define function to do the fine-tuning grad_to_input = T.grad(convnet.cost, convnet.input) compute_grad_to_input = theano.function(inputs=[convnet.input, convnet.truth], outputs=grad_to_input) # Begin training and fine-tuning the word-embedding matrix for i in xrange(configer.nepoch): right_count = 0 tot_cost = 0 # rate = learn_rate rate = learn_rate / (i/100+1) for j in xrange(num_batches): # Record the information of each minibatch minibatch_len = list() minibatch_indices = list() # Dynamically building training matrix using current word-embedding matrix minibatch_txt = self.senti_train_txt[j*batch_size : (j+1)*batch_size] minibatch = np.zeros((batch_size, self.word_embedding.embedding_dim()), dtype=floatX) for k, txt in enumerate(minibatch_txt): words = txt.split() words = [word.lower() for word in words] vectors = np.asarray([self.word_embedding.wordvec(word) for word in words]) minibatch[k, :] = np.mean(vectors, axis=0) # Record the length of each sentence minibatch_len.append(len(words)) # Record the index of each word in each sentence minibatch_indices.append([self.word_embedding.word2index(word) for word in words]) # Reshape into the form of input to CNN minibatch = minibatch.reshape((batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_train_label[j*batch_size : (j+1)*batch_size] # Training cost, accuracy = convnet.train(minibatch, label, rate) prediction = convnet.predict(minibatch) right_count += np.sum(label == prediction) tot_cost += cost # Fine-tuning for word-vector matrix grad_minibatch = compute_grad_to_input(minibatch, label) grad_minibatch = grad_minibatch.reshape((batch_size, self.word_embedding.embedding_dim())) # Updating the word2vec matrix minibatch_len = np.asarray(minibatch_len) grad_minibatch /= minibatch_len[:, np.newaxis] for k, indices in enumerate(minibatch_indices): for l in indices: self.word_embedding._embedding[l, :] -= 0.01 * rate * grad_minibatch[k, :] accuracy = right_count / float(self.train_size) pprint('Epoch %d, total cost: %f, overall accuracy: %f' % (i, tot_cost, accuracy)) if (i+1)%100 == 0: ConvNet.save('./sentiment.cnn', convnet) end_time = time.time() pprint('Time used to train CNN on Sentiment analysis task: %f minutes.' % ((end_time-start_time)/60)) # Test num_batches = self.test_size / batch_size right_count = 0 for i in xrange(num_batches): minibatch_txt = self.senti_test_txt[i*batch_size : (i+1)*batch_size] minibatch = np.zeros((batch_size, self.word_embedding.embedding_dim()), dtype=floatX) for j, txt in enumerate(minibatch_txt): words = txt.split() words = [word.lower() for word in words] vectors = np.asarray([self.word_embedding.wordvec(word) for word in words]) minibatch[j, :] = np.mean(vectors, axis=0) # Reshape into the form of input to CNN minibatch = minibatch.reshape((batch_size, 1, configer.image_row, configer.image_col)) label = self.senti_test_label[i*batch_size : (i+1)*batch_size] prediction = convnet.predict(minibatch) right_count += np.sum(prediction == label) test_accuracy = right_count / float(self.test_size) pprint('Test set accuracy: %f' % test_accuracy)