๋ฅ๋ฌ๋์ ํ์ฉํ์ฌ ๋ฏธ๋ก ๋งต์ ์๋์ผ๋ก ์์ฑํ๊ณ , Unity์์ ์ด๋ฅผ ์ ์ฉํ ๋ฏธ๋ก ํ์ถ ๊ฒ์์ ๊ฐ๋ฐํ๋ค.
'Unity๋ฅผ ํ์ฉํ ๊ฒ์ ๊ฐ๋ฐ'๊ณผ 'AI ๊ธฐ๋ฐ ๋ ๋ฒจ ์๋ ์์ฑ'์ด๋ผ๋ ๋ ๊ฐ์ง ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์งํํ๋ค.
-VAE ๋ชจ๋ธ์ ์ด์ฉํด ๋ฏธ๋ก ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํ์ตํ๊ณ , ๋ณ์ฃผ๋ฅผ ์์ฑํจ.
-unity์ ์ฐ๋ํ์ฌ์ ์์ฑ๋ ๋งต์ ๋๋ค์ผ๋ก ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ํ๋ ์ด์ด๊ฐ ์บ๋ฆญํฐ๋ฅผ ์ง์ ์กฐ์ํ์ฌ ํ์ถํ ์ ์๋๋ก ํจ.
์ผ๋จ VAE ํ์ต์ ๊ธฐ๋ณธ์ ์ธ ๋ผ๋๊ฐ ๋๋ ์ฝ๋๋ ์ด๋ฌํ๋ค... (์์ํ ์ค๋ฅ ๋๋ฌธ์ ๋ง์ ์์ ์ ๊ฑฐ์ณค์ ๐ฅฒ)
import os
import pandas as pd
import torch
import numpy as np
def load_data(data_dir, input_dim):
data = []
for file in os.listdir(data_dir):
file_path = os.path.join(data_dir, file)
array = pd.read_csv(file_path, header=None).values.flatten()
array[array == 2] = 0
array[array == 3] = 0
data.append(array)
data = np.array(data)
return torch.tensor(data, dtype=torch.float32)
data_dir = "/content/maze_dataset/maze_dataset"
input_dim = 15 * 15
import torch.nn as nn
class VAE(nn.Module):
def __init__(self, input_dim, latent_dim):
super(VAE, self).__init__()
self.encoder = nn.Sequential(
nn.Flatten(),
nn.Linear(input_dim, 256),
nn.ReLU(),
nn.Linear(256, latent_dim * 2)
)
self.decoder = nn.Sequential(
nn.Linear(latent_dim, 256),
nn.ReLU(),
nn.Linear(256, input_dim),
nn.Sigmoid()
)
self.input_dim = input_dim
self.latent_dim = latent_dim
def reparameterize(self, mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * std
def forward(self, x):
x = x.view(-1, self.input_dim)
params = self.encoder(x)
mu, log_var = params[:, :self.latent_dim], params[:, self.latent_dim:]
z = self.reparameterize(mu, log_var)
recon = self.decoder(z)
return recon, mu, log_var
# ์์ค ํจ์ (Reconstruction Loss + KL Divergence)
def loss_function(recon_x, x, mu, log_var):
recon_loss = nn.BCELoss()(recon_x, x)
kl_div = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())
return recon_loss + kl_div
# ํ์ต ํจ์
def train_vae(model, data_loader, epochs, optimizer, device):
model.train()
for epoch in range(epochs):
total_loss = 0
for x in data_loader:
x = x.to(device)
optimizer.zero_grad()
recon, mu, log_var = model(x)
loss = loss_function(recon, x, mu, log_var)
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch+1}, Loss: {total_loss / len(data_loader)}")
from torch.utils.data import DataLoader
import torch.optim as optim
# ๋ฐ์ดํฐ ๋ก๋
data = load_data(data_dir, input_dim)
data_loader = DataLoader(data, batch_size=32, shuffle=True)
# ๋ชจ๋ธ ์ด๊ธฐํ
latent_dim = 10 # ์ ์ฌ ๊ณต๊ฐ ํฌ๊ธฐ
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = VAE(input_dim=input_dim, latent_dim=latent_dim).to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)
# ํ์ต ์คํ
train_vae(model, data_loader, epochs=50, optimizer=optimizer, device=device)
# ์๋ก์ด ๋งต ์์ฑ ํจ์
def generate_map(model, device):
model.eval()
with torch.no_grad():
z = torch.randn(1, model.latent_dim).to(device) # ๋๋ค ์ ์ฌ ๋ฒกํฐ
generated = model.decoder(z)
generated = generated.view(15, 15).cpu().numpy()
return np.round(generated) # 0๊ณผ 1๋ก ๋ณํ

๋ฒจ๋ก๊ทธ์ ๋์์ ์ฒจ๋ถ๊ฐ ์ ๋๋๊ตฌ๋ ใ ใ ใ