0
respostas

Faça como eu fiz na aula

import torch 
import torch.nn as nn 
import torch.optim as optim 
import numpy as np 
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# Dados
iris = load_iris()
X = iris.data[:, :3]
y = iris.target

# Normalização
scaler = StandardScaler()
X = scaler.fit_transform(X)

# Conversão para tensor e divisão de treinamento
X = torch.FloatTensor(X)
y = torch.LongTensor(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Modelo nn.Sequential 
input_size=3
hidden_size=6
output_size=3

net_sequential = nn.Sequential(nn.Linear(in_features=input_size, out_features=hidden_size), 
                               nn.ReLU(), 
                               nn.Linear(in_features=hidden_size, out_features=output_size))
# Classe com nn.Module
class Net(nn.Module):

    def __init__(self, input_size, hidden_size, output_size):
        super(Net, self).__init__()

        self.hidden = nn.Linear(input_size, hidden_size)
        self.relu   = nn.ReLU()
        self.output = nn.Linear(hidden_size, output_size)

    def forward(self, X):
        hidden = self.relu(self.hidden(X))
        output = self.output(hidden)
        return output

net_module = Net(input_size=input_size, hidden_size=hidden_size, output_size=output_size)

# Função de perda e otimização 
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net_sequential.parameters(), lr=0.1)

# Loop de treinamento
epochs = 5000

for epoch in range(epochs):

    optimizer.zero_grad()

    outputs = net_sequential(X_train)
    loss = criterion(outputs, y_train)

    loss.backward()
    optimizer.step()

    if epoch % 20 == 0:
        print(f"Epoch {epoch}, Loss: {loss.item():.4f}")
        
# Avaliação
with torch.no_grad():
    outputs = net_sequential(X_test)
    _, predicted = torch.max(outputs, 1)
    accuracy = (predicted == y_test).float().mean()

print(f"Acurácia: {accuracy:.4f}")

# Plot: 
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')

colors = ['red', 'orange', 'gray']

for i in range(3):
    ax.scatter(
        X[y == i][:,0],
        X[y == i][:,1],
        X[y == i][:,2],
        c=colors[i],
        label=iris.target_names[i]
    )

ax.set_xlabel("Feature 1")
ax.set_ylabel("Feature 2")
ax.set_zlabel("Feature 3")
ax.legend()

plt.title("Iris Dataset")
plt.show()

Insira aqui a descrição dessa imagem para ajudar na acessibilidade