import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt

n_data = torch.ones(100,2)
x0 = torch.normal(2*n_data,1)
y0 = torch.zeros(100)
x1 = torch.normal(-2*n_data,1)
y1 = torch.ones(100)
x = torch.cat((x0,x1)).type(torch.FloatTensor)
y = torch.cat((y0,y1)).type(torch.LongTensor)        #class must be longtensor


x, y = Variable(x),Variable(y)

# plt.scatter(x.data.numpy()[:,0],x.data.numpy()[:, 1],c = y.data.numpy())
# plt.show()



class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)

    def forward(self, x):
        x = F.relu(self.hidden(x))
        x = self.predict(x)
        return x

net = Net(2,10,2)

optimizer = torch.optim.SGD(net.parameters(),lr=0.02)
loss_func = torch.nn.CrossEntropyLoss()

# plt.ion()
# plt.show()
# for t in range(100):
#     out = net(x)
#
#     loss = loss_func(out, y)
#
#     optimizer.zero_grad()
#     loss.backward()
#     optimizer.step()
#
#     if t %1 ==0:
#         plt.cla()
#         prediction = torch.max(F.softmax(out),1)[1]
#         pred_y = prediction.data.numpy().squeeze()
#         target_y = y.data.numpy()
#         plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y)
#         accuracy = sum(pred_y == target_y)/200.
#         plt.text(1.5,-4 ,'Accuracy = %.2f' %accuracy,color = 'red')
#         plt.pause(0.1)
#
# plt.ioff()
# plt.show()
#
#
#
# method 2

net2 = torch.nn.Sequential(
    torch.nn.Linear(2,10),
    torch.nn.ReLU(),
    torch.nn.Linear(10,2)
)

print net
print net2

import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt

n_data = torch.ones(100,2)
x0 = torch.normal(2*n_data,1)
y0 = torch.zeros(100)
x1 = torch.normal(-2*n_data,1)
y1 = torch.ones(100)
x = torch.cat((x0,x1)).type(torch.FloatTensor)
y = torch.cat((y0,y1)).type(torch.LongTensor)        #class must be longtensor


x, y = Variable(x),Variable(y)

# plt.scatter(x.data.numpy()[:,0],x.data.numpy()[:, 1],c = y.data.numpy())
# plt.show()



class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)

    def forward(self, x):
        x = F.relu(self.hidden(x))
        x = self.predict(x)
        return x

net = Net(2,10,2)

optimizer = torch.optim.SGD(net.parameters(),lr=0.02)
loss_func = torch.nn.CrossEntropyLoss()

# plt.ion()
# plt.show()
# for t in range(100):
#     out = net(x)
#
#     loss = loss_func(out, y)
#
#     optimizer.zero_grad()
#     loss.backward()
#     optimizer.step()
#
#     if t %1 ==0:
#         plt.cla()
#         prediction = torch.max(F.softmax(out),1)[1]
#         pred_y = prediction.data.numpy().squeeze()
#         target_y = y.data.numpy()
#         plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y)
#         accuracy = sum(pred_y == target_y)/200.
#         plt.text(1.5,-4 ,'Accuracy = %.2f' %accuracy,color = 'red')
#         plt.pause(0.1)
#
# plt.ioff()
# plt.show()
#
#
#
# method 2

net2 = torch.nn.Sequential(
    torch.nn.Linear(2,10),
    torch.nn.ReLU(),
    torch.nn.Linear(10,2)
)

print net
print net2

#class must be longtensor # plt.scatter(x.data.numpy()[:,0],x.data.numpy()[:, 1],c = y.data.numpy()) # plt.show() # plt.ion() # plt.show() # for t in range(100): #     out = net(x) # #     loss = loss_func(out, y) # #     optimizer.zero_grad() #     loss.backward() #     optimizer.step() # #     if t %1 ==0: #         plt.cla() #         prediction = torch.max(F.softmax(out),1)[1] #         pred_y = prediction.data.numpy().squeeze() #         target_y = y.data.numpy() #         plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y) #         accuracy = sum(pred_y == target_y)/200. #         plt.text(1.5,-4 ,'Accuracy = %.2f' %accuracy,color = 'red') #         plt.pause(0.1) # # plt.ioff() # plt.show() # # # # method 2