Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2021:hier_kommt_ihr_zum_code

Dies ist eine alte Version des Dokuments!


from example_physionet import X, Y # Daten importieren

import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable import torch.optim as optim

import random import numpy as np import pandas

y_train = Y['diagnostic_superclass'][:1000] XY = [(X[i],y_train[i+1]) for i in range(1000)]

y_test = Y['diagnostic_superclass'][1101:1201] x_test = X[1100:1200]

class Netzwerk(nn.Module):

  def __init__(self):
      super(Netzwerk, self).__init__()
      self.conv1 = nn.Conv1d(12, 12, kernel_size=3, stride=1, padding=1)
      self.pool1 = nn.MaxPool1d(kernel_size=3, stride=2, padding=1)
      self.conv2 = nn.Conv1d(12, 4, kernel_size=2, padding=1)
      self.pool2 = nn.MaxPool1d(3, stride=2, padding=0)
      self.lin1 = nn.Linear(4*250, 30)
      self.lin2 = nn.Linear(30, 10)
      self.lin3 = nn.Linear(10, 2)
  def forward(self, x):
      x = self.pool1(F.relu(self.conv1(x)))
      x = self.pool2(F.relu(self.conv2(x)))
      x = x.view(-1, 4*250)       # umwandeln der Shape, sodass Uebergang von Conv. Layer zu linearen layers moeglich
      x = F.relu(self.lin1(x))
      x = F.relu(self.lin2(x))
      x = self.lin3(x)
      return x
  def num_flat_features(self, x):
    """eigentlich irrelevant???"""
    size = x.size()[1:]
    num = 1
    for i in size:
      num *= i
    return num

net = Netzwerk() learning_rate = 0.1 batch_size = 40 optimizer = optim.SGD(net.parameters(), lr=learning_rate)

def is_norm(y):

  """wandelt Label des Datensatzes aus Textform in fuer Netzwerk erkennbare Form um"""
  if y == ['NORM']:        # Y-Index ist im Vergleich zum X-Index um +1 verschoben
      return [1, 0]
  else:
      return [0, 1]

def train(epoch = 50, b_s = batch_size):

  net.train()
  for i in range(epoch):
      random.shuffle(XY)
      # input-Werte
      my_inp = [XY[j][0].T for j in range(batch_size)]
      my_in = Variable(torch.Tensor(my_inp))
      my_in = my_in.reshape(batch_size, 12, 1000)
      # target-Werte
      ziel = [is_norm(XY[k][1]) for k in range(batch_size)]
      zielw = Variable(torch.Tensor(ziel))
      zielw = zielw.unsqueeze(1)
      criterion = nn.MSELoss()    # die Fehlerfunktion auf mean-squared-error setzen
      optimizer.zero_grad()       # Gradienten der vorherigen Epoche ausloeschen
      out = net(my_in)            # forward propagation
      loss = criterion(out, zielw)    # Fehler berechnen
      loss.backward()                 # backward propagation
      optimizer.step()                # weights and biases neu einstellen
      print(evaluate())               # Evaluation mit unabhaengigen Test-Daten printen

def evaluate(welche_richtig=False):

  """ermittelt, wie oft das Netz ein richtig zugeordnetes EKG erkennt
  mittels 'welche_richtig=True' kann man sich die Label der richtig erkannten EKGs ausgeben lassen"""
  global y_test
  global x_test
  z = 0
  for i in range(100):
      x = Variable(torch.Tensor(x_test[i]))
      x = x.reshape(12, 1000)
      x = x.unsqueeze(0)
      #x = x.unsqueeze(0)
      if torch.argmax(net(x)) == np.argmax(is_norm(y_test[1102+i])):
          z += 1
          if welche_richtig==True:        # printet Labels der richtig klassifizierten EKGs aus Test-Werten
              print(y_test[1102+i])
  return z

train()

ws2021/hier_kommt_ihr_zum_code.1611925731.txt.gz · Zuletzt geändert: 2021/01/29 14:08 von elena_kirschner