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()