def test_model(XOR):
    """Just makes sure that this code will run; it doesn't check that
    it is creating good models.
    """
    X, y = XOR
    model = TorchShallowNeuralClassifier(hidden_dim=4,
                                         hidden_activation=nn.ReLU(),
                                         max_iter=100,
                                         eta=0.01)
    model.fit(X, y)
    model.predict(X)
    model.predict_proba(X)
def test_save_load(XOR):
    X, y = XOR
    mod = TorchShallowNeuralClassifier(hidden_dim=4,
                                       hidden_activation=nn.ReLU(),
                                       max_iter=100,
                                       eta=0.01)
    mod.fit(X, y)
    mod.predict(X)
    with tempfile.NamedTemporaryFile(mode='wb') as f:
        name = f.name
        mod.to_pickle(name)
        mod2 = TorchShallowNeuralClassifier.from_pickle(name)
        mod2.predict(X)
        mod2.fit(X, y)
def test_simple_example_params(digits, param, expected):
    X_train, X_test, y_train, y_test = digits
    mod = TorchShallowNeuralClassifier(**{param: expected})
    mod.fit(X_train, y_train)
    preds = mod.predict(X_test)
    acc = accuracy_score(y_test, preds)
    if not (param in ["max_iter", "batch_size"] and expected <= 1):
        assert acc >= 0.86
示例#4
0
# In[25]:


hf_mod = TorchShallowNeuralClassifier(max_iter=100, hidden_dim=300)


# In[26]:


get_ipython().run_line_magic('time', '_ = hf_mod.fit(X_hf_train, y_hf_train)')


# In[27]:


hf_preds = hf_mod.predict(X_hf_dev)


# In[28]:


print(classification_report(y_hf_dev, hf_preds, digits=3))


# #### A feed-forward experiment with the sst module
# 
# It is straightforward to conduct experiments like the above using `sst.experiment`, which will enable you to do a wider range of experiments without writing or copy-pasting a lot of code. 

# In[29]:

class Shallow_Neural_Classifier:
    '''
    Modified torch shallow neural classifier wrapper class for initial fitting and then fine tuning of weights.
    '''

    def __init__(self, sent140_train_X, sent140_dev_X, sent140_train_Y, sent140_dev_Y, emoji_train_X, emoji_dev_X, emoji_test_X, emoji_train_Y, emoji_dev_Y, emoji_test_Y, emojiless_train_X, emojiless_dev_X, emojiless_test_X, emojiless_train_Y, emojiless_dev_Y, emojiless_test_Y, testing):
        '''
        Pass in initial data for fitting to constructor. Later adding passing logisitic regression
        parameters into constructor.
        '''
        self.testing = testing

        self.sent140_train_X = sent140_train_X
        self.sent140_train_Y = sent140_train_Y
        self.sent140_dev_X = sent140_dev_X
        self.sent140_dev_Y = sent140_dev_Y

        self.emoji_train_X = emoji_train_X
        self.emoji_train_Y = emoji_train_Y
        self.emoji_dev_X = emoji_dev_X
        self.emoji_dev_Y = emoji_dev_Y
        if self.testing:
            self.emoji_test_X = emoji_test_X
            self.emoji_test_Y = emoji_test_Y
        
        self.emojiless_train_X = emojiless_train_X
        self.emojiless_train_Y = emojiless_train_Y
        self.emojiless_dev_X = emojiless_dev_X
        self.emojiless_dev_Y = emojiless_dev_Y
        if self.testing:
            self.emojiless_test_X = emojiless_test_X
            self.emojiless_test_Y = emojiless_test_Y

        # pass in model parameters for to constructor?
    

    def run_sent140(self):
        '''
        Trained on sent140, predict on emoji
        Report score on sent 140 too, just because it's intersting
        '''
        # model
        self.model_sent140 = TorchShallowNeuralClassifier()

        # train
        self.model_sent140.fit(self.sent140_train_X, self.sent140_train_Y)

        # test on sent140
        sent140_train_preds = self.model_sent140.predict(self.sent140_train_X)
        sent140_dev_preds = self.model_sent140.predict(self.sent140_dev_X)
        
        # test on emoji
        emoji_train_preds = self.model_sent140.predict(self.emoji_train_X)
        emoji_dev_preds = self.model_sent140.predict(self.emoji_dev_X)
        if self.testing:
            emoji_test_preds = self.model_sent140.predict(self.emoji_test_X)
        else:
            emoji_test_preds = None

        return (sent140_train_preds, sent140_dev_preds, emoji_train_preds, emoji_dev_preds, emoji_test_preds)
    

    def run_sent140_emojiless(self):
        '''
        Trained on sent140, fine-tuned on emojiless, predict on emoji
        Report score on sent 140 too, just because it's intersting
        '''
        # model
        self.model_sent140_emojiless = TorchShallowNeuralClassifier()

        # train
        # combine features
        combined_train_X = np.vstack((self.sent140_train_X, self.emojiless_train_X))
        combined_train_Y = self.sent140_train_Y + self.emojiless_train_Y
        self.model_sent140_emojiless.fit(combined_train_X, combined_train_Y)

        # test on sent140
        sent140_train_preds = self.model_sent140_emojiless.predict(self.sent140_train_X)
        sent140_dev_preds = self.model_sent140_emojiless.predict(self.sent140_dev_X)
        
        # test on emoji
        emoji_train_preds = self.model_sent140_emojiless.predict(self.emoji_train_X)
        emoji_dev_preds = self.model_sent140_emojiless.predict(self.emoji_dev_X)
        if self.testing:
            emoji_test_preds = self.model_sent140_emojiless.predict(self.emoji_test_X)
        else:
            emoji_test_preds = None

        return (sent140_train_preds, sent140_dev_preds, emoji_train_preds, emoji_dev_preds, emoji_test_preds)

    
    def run_sent140_emoji(self):
        '''
        Trained on sent140, fine-tuned on emoji, predict on emoji
        Report score on sent 140 too, just because it's intersting
        '''
        # model
        self.model_sent140_emoji = TorchShallowNeuralClassifier()

        # train
        combined_train_X = np.vstack((self.sent140_train_X, self.emoji_train_X))
        combined_train_Y = self.sent140_train_Y + self.emoji_train_Y
        self.model_sent140_emoji.fit(combined_train_X, combined_train_Y)

        # test on sent140
        sent140_train_preds = self.model_sent140_emoji.predict(self.sent140_train_X)
        sent140_dev_preds = self.model_sent140_emoji.predict(self.sent140_dev_X)
        
        # test on emoji
        emoji_train_preds = self.model_sent140_emoji.predict(self.emoji_train_X)
        emoji_dev_preds = self.model_sent140_emoji.predict(self.emoji_dev_X)
        if self.testing:
            emoji_test_preds = self.model_sent140_emoji.predict(self.emoji_test_X)
        else:
            emoji_test_preds = None
        
        return (sent140_train_preds, sent140_dev_preds, emoji_train_preds, emoji_dev_preds, emoji_test_preds)