Si vous voulez faire ce que vous voulez avec Keras, vous finissez par utiliser tensorflow, donc PyTorch est mieux, non? J'ai donc immédiatement implémenté XOR.
import torch
import torch.nn as nn
import torch.optim as optim
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = torch.nn.Linear(2, 8)
        self.fc2 = torch.nn.Linear(8, 8)
        self.fc3 = torch.nn.Linear(8, 1)
        self.sigmoid = nn.Sigmoid()
    def forward(self, x):
        x = torch.nn.functional.relu(self.fc1(x))
        x = torch.nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        x = self.sigmoid(x)
        return x
def main():
    import numpy as np
    x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
    y = np.array([[0], [1], [1], [0]])
    num_epochs = 10000
    # convert numpy array to tensor
    x_tensor = torch.from_numpy(x).float()
    y_tensor = torch.from_numpy(y).float()
    # crate instance
    net = Net()
    # set training mode
    net.train()
    # set training parameters
    optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
    criterion = torch.nn.MSELoss()
    # start to train
    epoch_loss = []
    for epoch in range(num_epochs):
        print(epoch)
        # forward
        outputs = net(x_tensor)
        # calculate loss
        loss = criterion(outputs, y_tensor)
        # update weights
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # save loss of this epoch
        epoch_loss.append(loss.data.numpy().tolist())
    print(net(torch.from_numpy(np.array([[0, 0]])).float()))
    print(net(torch.from_numpy(np.array([[1, 0]])).float()))
    print(net(torch.from_numpy(np.array([[0, 1]])).float()))
    print(net(torch.from_numpy(np.array([[1, 1]])).float()))
if __name__ == "__main__":
    main()
tensor([[0.0511]], grad_fn=<SigmoidBackward>)
tensor([[0.9363]], grad_fn=<SigmoidBackward>)
tensor([[0.9498]], grad_fn=<SigmoidBackward>)
tensor([[0.0666]], grad_fn=<SigmoidBackward>)
Oh, ça fait du bien.
C'est toujours juste une touche, mais comparé à Keras et Tensorflow, cela ne ressemble pas à une boîte noire et on a l'impression qu'il peut être utilisé de manière transparente à partir de Python. Par exemple, même si vous mettez une instruction d'impression dans le modèle, elle sera sortie telle quelle. La visualisation pendant l'exécution semble être très facile à faire.
Recommended Posts