Я работаю над своим окончательным проектом исследований, который обнаруживает аномалии в ирригационной системе.
Мы смоделировали ирригационную сеть в ограниченной среде, как вы можете видеть на фотографии ниже. Модель, которую мы создали < /p>
Существует печатная плата, где микроконтроллер ESP32 считывает значения. Моя идея состоит в том, чтобы сделать его простым и создать простую модель нейронной сети с использованием Pytorch, которая получает состояние клапанов в качестве входных данных (0 выключено, а 1 - Ex: 0110) и один вывод, который является значением давления. Таким образом, это означает, что наша система будет прогнозировать давление со стороны комбинаций клапанов. Набор данных создается путем получения определенных комбинаций клапанов (используя фракционную факториальную конструкцию), но я добавил другие комбинации, такие как 1000, 0100, 0010, 00001, 1110 и 0111, а затем дополняется, чтобы получить большой набор данных.
Вот модель: < /p>
import torch
import torch.nn as nn
class PressureNeuralNet(nn.Module):
def __init__(self, n_valves, hidden_size=32, dropout_rate=0.1):
super().__init__()
self.network = nn.Sequential(
nn.Linear(n_valves, hidden_size),
nn.ReLU(),
nn.Dropout(dropout_rate),
nn.Linear(hidden_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, 1)
)
def forward(self, x):
return self.network(x)
< /code>
Процесс обучения: < /p>
nn_model = PressureNeuralNet(n_valves)
# Define loss and optimizers
criterion = nn.MSELoss()
nn_optimizer = optim.Adam(nn_model.parameters(), lr=0.01, weight_decay=1e-5)
nn_scheduler = optim.lr_scheduler.ReduceLROnPlateau(nn_optimizer, mode='min', patience=5, factor=0.5, verbose=True)
print("\nTraining Neural Network...")
nn_train_losses, nn_test_losses = train_model(
nn_model, train_loader, test_loader, criterion, nn_optimizer, nn_scheduler
)
< /code>
Функция модели поезда: < /p>
def train_model(model, train_loader, test_loader, criterion, optimizer, scheduler=None, epochs=1000):
train_losses = []
test_losses = []
best_test_loss = float('inf')
for epoch in range(epochs):
model.train()
running_loss = 0.0
for valve_states, pressures in train_loader:
optimizer.zero_grad()
outputs = model(valve_states).squeeze()
loss = criterion(outputs, pressures)
loss.backward()
optimizer.step()
running_loss += loss.item()
avg_train_loss = running_loss / len(train_loader)
train_losses.append(avg_train_loss)
model.eval()
test_loss = 0.0
with torch.no_grad():
for valve_states, pressures in test_loader:
outputs = model(valve_states).squeeze()
loss = criterion(outputs, pressures)
test_loss += loss.item()
avg_test_loss = test_loss / len(test_loader)
test_losses.append(avg_test_loss)
if avg_test_loss < best_test_loss:
best_test_loss = avg_test_loss
torch.save(model.state_dict(), 'best_model.pth')
print(f"Saved best model with Test Loss: {best_test_loss:.4f}")
if scheduler:
scheduler.step(avg_test_loss)
if (epoch + 1) % 10 == 0:
print(f"Epoch [{epoch + 1}/{epochs}], Train Loss: {avg_train_loss:.4f}, Test Loss: {avg_test_loss:.4f}")
if scheduler:
print(f"Current Learning Rate: {optimizer.param_groups[0]['lr']:.6f}")
return train_losses, test_losses
< /code>
Значение MSE составляет: 0,0004
, что измеряет модель очень хорошо. Теперь проблема заключается в том, что при прогнозировании комбинации, которую она не извлекала из набора данных (1101 Значение чтения: 0,53 Предсказано: 0,10, что является ложным предупреждением), из -за метода выборки, который мы использовали (фракционная факториальная конструкция).
(если вы спрашиваете, почему мы использовали этот метод, чтобы получить определенные образцы, которые влияют на выходные данные и предотвращение водного и энергетического потребления). Будьте проблемой из -за значений комбинаций отдельных клапанов, все они имеют одинаковое значение: 0,5, но комбинация 0100 имеет значение давления: 0,45. не очень хорошо задавал мой вопрос.
Подробнее здесь: https://stackoverflow.com/questions/796 ... on-in-a-si
Модель нейронной сети в проблеме прогнозирования Pytorch для обнаружения аномалий в моделируемой ирригационной системе ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Pytorch -> Можно ли получить значимые результаты на промежуточных слоях нейронной сети?
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-