Spaces:
Running
Running
File size: 3,346 Bytes
a1ac93a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from torchvision.transforms import Compose, ToTensor, Normalize
from sklearn.metrics import accuracy_score
import h5py
# Veriyi yüklemek için bir fonksiyon
def load_hdf5_dataset(path):
with h5py.File(path, "r") as f:
images = torch.tensor(f['images'][:]) # Görseller
labels = torch.tensor(f['labels'][:]) # Etiketler
return images, labels
# Verileri yükleme
train_images, train_labels = load_hdf5_dataset('train_dataset.hdf5')
test_images, test_labels = load_hdf5_dataset('test_dataset.hdf5')
# Normalize etmek ve tensöre dönüştürmek için dönüşümler
transform = Compose([ToTensor(), Normalize((0.5,), (0.5,))])
# Verileri normalize et ve TensorDataset oluştur
train_images = train_images.permute(0, 3, 1, 2) / 255.0 # Görüntüleri 0-1 aralığına getir
test_images = test_images.permute(0, 3, 1, 2) / 255.0
train_dataset = TensorDataset(train_images, train_labels)
test_dataset = TensorDataset(test_images, test_labels)
# CNN Modelini Tanımlama
class GalaxyCNN(nn.Module):
def __init__(self):
super(GalaxyCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(64 * 16 * 16, 128) # Fully connected layer
self.fc2 = nn.Linear(128, 4) # 4 sınıf (smooth_round, smooth_cigar, vb.)
self.relu = nn.ReLU()
self.dropout = nn.Dropout(0.25)
def forward(self, x):
x = self.pool(self.relu(self.conv1(x)))
x = self.pool(self.relu(self.conv2(x)))
x = x.view(-1, 64 * 16 * 16) # Flatten
x = self.dropout(self.relu(self.fc1(x)))
x = self.fc2(x)
return x
# DataLoader
batch_size = 32
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
# Model ve cihaz
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GalaxyCNN().to(device)
# Kayıp fonksiyonu ve optimizasyon
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# Eğitim
epochs = 10
for epoch in range(epochs):
model.train()
running_loss = 0.0
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
avg_loss = running_loss / len(train_loader)
print(f"Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.4f}")
# Test ve doğrulama
model.eval()
all_preds = []
all_labels = []
with torch.no_grad():
for images, labels in test_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, preds = torch.max(outputs, 1)
all_preds.extend(preds.cpu().numpy())
all_labels.extend(labels.cpu().numpy())
accuracy = accuracy_score(all_labels, all_preds)
print(f"Validation Accuracy: {accuracy * 100:.2f}%")
torch.save(model.state_dict(), "galaxy_cnn_model.pt")
print("Model kaydedildi: galaxy_cnn_model.pt")
|