Я пытаюсь построить модель DQN для своей докторской диссертации, и прежде чем реализовать ее на реальных данных, я хочу использовать фиктивные данные.
Используя тот же процесс с простым Q Learning, этот подход оказался эффективным, но как только я перешел на DQN, чтобы сделать его более продвинутым и адаптивным, я начал сталкиваться с проблемами на этапе обучения. Я также реализовал ускорение графического процессора, но это совсем не помогает. Интересно, связано ли это с размером фиктивного набора данных или с чем-то еще, чего я не могу понять.
Любая помощь или рекомендации приветствуются.
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import random
import pandas as pd
from collections import deque
# Set device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("Running on device:", device)
# Dummy data setup
data = {
'message_size': np.random.randint(1000, 70000, size=1000),
'cpu_usage': np.random.uniform(40, 100, size=1000),
'submission_time': np.random.uniform(0, 300, size=1000)
}
dummy_data = pd.DataFrame(data)
# Parameters
MAX_BLOCK_SIZE = 32768
ALPHA = 0.1
GAMMA = 0.9
EPSILON = 1.0
EPSILON_MIN = 0.01
EPSILON_DECAY = 0.99
BATCH_SIZE = 32
EPISODES = 1000
# DQN model
class DQN(nn.Module):
def __init__(self, input_dim):
super(DQN, self).__init__()
self.fc1 = nn.Linear(input_dim, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return self.fc3(x)
# Initialize models and optimizer
dqn = DQN(input_dim=2).to(device)
target_model = DQN(input_dim=2).to(device)
target_model.load_state_dict(dqn.state_dict())
optimizer = optim.Adam(dqn.parameters(), lr=ALPHA)
memory = deque(maxlen=2000)
# Block choice function
def block_choice(state):
if random.random() < EPSILON:
return random.randint(1, int(state[0] // MAX_BLOCK_SIZE) + 1)
else:
state_tensor = torch.FloatTensor(state).to(device)
return torch.argmax(dqn(state_tensor)).item() + 1
# Reward function based on utility
def utility_function_rewarding(total_latency, cpu_per_block, max_latency=300, max_cpu=100):
latency_reward = max(0, 1 - (total_latency / max_latency))
cpu_reward = max(0, 1 - (cpu_per_block / max_cpu))
return latency_reward + cpu_reward
# Training function
def dqn_training(batch_size):
if len(memory) < batch_size:
return
batch = random.sample(memory, batch_size)
states, actions, rewards, next_states, dones = zip(*batch)
# Move data to device
states = torch.FloatTensor(states).to(device)
rewards = torch.FloatTensor(rewards).to(device)
next_states = torch.FloatTensor(next_states).to(device)
dones = torch.FloatTensor(dones).to(device)
state_action_values = dqn(states)
next_state_values = target_model(next_states).max(1)[0]
expected_values = rewards + (GAMMA * next_state_values * (1 - dones))
loss = nn.functional.mse_loss(state_action_values, expected_values)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Store transitions in memory
def store_transition(state, action, reward, next_state, done):
memory.append((state, action, reward, next_state, done))
# Main training loop
for episode in range(EPISODES):
print(f"Starting Episode {episode + 1}/{EPISODES}")
row = dummy_data.sample().iloc[0]
state = [row['submission_time'], row['cpu_usage']]
total_reward = 0
done = False
while not done:
action = block_choice(state)
next_row = dummy_data.sample().iloc[0]
next_latency = next_row['submission_time']
next_cpu = next_row['cpu_usage'] / action
next_state = [next_latency, next_cpu]
reward = utility_function_rewarding(next_latency, next_cpu)
total_reward += reward
done = episode == EPISODES - 1
store_transition(state, action, reward, next_state, done)
state = next_state
dqn_training(BATCH_SIZE)
# Update epsilon for exploration-exploitation balance
if EPSILON > EPSILON_MIN:
EPSILON *= EPSILON_DECAY
print(f"Episode {episode + 1}/{EPISODES} - Total Reward: {total_reward}")
Подробнее здесь: https://stackoverflow.com/questions/791 ... n-training
Модель DQN либо не работает, либо обучается очень медленно. ⇐ Python
Программы на Python
-
Anonymous
1762247895
Anonymous
Я пытаюсь построить модель DQN для своей докторской диссертации, и прежде чем реализовать ее на реальных данных, я хочу использовать фиктивные данные.
Используя тот же процесс с простым Q Learning, этот подход оказался эффективным, но как только я перешел на DQN, чтобы сделать его более продвинутым и адаптивным, я начал сталкиваться с проблемами на этапе обучения. Я также реализовал ускорение графического процессора, но это совсем не помогает. Интересно, связано ли это с размером фиктивного набора данных или с чем-то еще, чего я не могу понять.
Любая помощь или рекомендации приветствуются.
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import random
import pandas as pd
from collections import deque
# Set device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("Running on device:", device)
# Dummy data setup
data = {
'message_size': np.random.randint(1000, 70000, size=1000),
'cpu_usage': np.random.uniform(40, 100, size=1000),
'submission_time': np.random.uniform(0, 300, size=1000)
}
dummy_data = pd.DataFrame(data)
# Parameters
MAX_BLOCK_SIZE = 32768
ALPHA = 0.1
GAMMA = 0.9
EPSILON = 1.0
EPSILON_MIN = 0.01
EPSILON_DECAY = 0.99
BATCH_SIZE = 32
EPISODES = 1000
# DQN model
class DQN(nn.Module):
def __init__(self, input_dim):
super(DQN, self).__init__()
self.fc1 = nn.Linear(input_dim, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
return self.fc3(x)
# Initialize models and optimizer
dqn = DQN(input_dim=2).to(device)
target_model = DQN(input_dim=2).to(device)
target_model.load_state_dict(dqn.state_dict())
optimizer = optim.Adam(dqn.parameters(), lr=ALPHA)
memory = deque(maxlen=2000)
# Block choice function
def block_choice(state):
if random.random() < EPSILON:
return random.randint(1, int(state[0] // MAX_BLOCK_SIZE) + 1)
else:
state_tensor = torch.FloatTensor(state).to(device)
return torch.argmax(dqn(state_tensor)).item() + 1
# Reward function based on utility
def utility_function_rewarding(total_latency, cpu_per_block, max_latency=300, max_cpu=100):
latency_reward = max(0, 1 - (total_latency / max_latency))
cpu_reward = max(0, 1 - (cpu_per_block / max_cpu))
return latency_reward + cpu_reward
# Training function
def dqn_training(batch_size):
if len(memory) < batch_size:
return
batch = random.sample(memory, batch_size)
states, actions, rewards, next_states, dones = zip(*batch)
# Move data to device
states = torch.FloatTensor(states).to(device)
rewards = torch.FloatTensor(rewards).to(device)
next_states = torch.FloatTensor(next_states).to(device)
dones = torch.FloatTensor(dones).to(device)
state_action_values = dqn(states)
next_state_values = target_model(next_states).max(1)[0]
expected_values = rewards + (GAMMA * next_state_values * (1 - dones))
loss = nn.functional.mse_loss(state_action_values, expected_values)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Store transitions in memory
def store_transition(state, action, reward, next_state, done):
memory.append((state, action, reward, next_state, done))
# Main training loop
for episode in range(EPISODES):
print(f"Starting Episode {episode + 1}/{EPISODES}")
row = dummy_data.sample().iloc[0]
state = [row['submission_time'], row['cpu_usage']]
total_reward = 0
done = False
while not done:
action = block_choice(state)
next_row = dummy_data.sample().iloc[0]
next_latency = next_row['submission_time']
next_cpu = next_row['cpu_usage'] / action
next_state = [next_latency, next_cpu]
reward = utility_function_rewarding(next_latency, next_cpu)
total_reward += reward
done = episode == EPISODES - 1
store_transition(state, action, reward, next_state, done)
state = next_state
dqn_training(BATCH_SIZE)
# Update epsilon for exploration-exploitation balance
if EPSILON > EPSILON_MIN:
EPSILON *= EPSILON_DECAY
print(f"Episode {episode + 1}/{EPISODES} - Total Reward: {total_reward}")
Подробнее здесь: [url]https://stackoverflow.com/questions/79156403/dqn-model-either-doesnt-work-or-it-is-extremely-slow-in-training[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия