Fixed the Model classes, Visualization

This commit is contained in:
Si11ium 2019-08-23 13:10:47 +02:00
parent 0e879bfdb1
commit 7b0b96eaa3
16 changed files with 141 additions and 469 deletions

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/data" />
</content>
<orderEntry type="jdk" jdkName="Python 3.7 (torch)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="renderExternalDocumentation" value="true" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

View File

@ -1,9 +0,0 @@
<component name="ProjectDictionaryState">
<dictionary name="illium">
<words>
<w>dataloader</w>
<w>datasets</w>
<w>isovists</w>
</words>
</dictionary>
</component>

View File

@ -1,5 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" />
</settings>
</component>

7
.idea/misc.xml generated
View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (torch)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated
View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ae_toolbox_torch.iml" filepath="$PROJECT_DIR$/.idea/ae_toolbox_torch.iml" />
</modules>
</component>
</project>

7
.idea/other.xml generated
View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PySciProjectComponent">
<option name="PY_SCI_VIEW" value="true" />
<option name="PY_SCI_VIEW_SUGGESTED" value="true" />
</component>
</project>

6
.idea/vcs.xml generated
View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

284
.idea/workspace.xml generated
View File

@ -1,284 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="5955480a-c876-43d5-afd7-8717f51f413e" name="Default Changelist" comment="Done: Latent Space Viz&#10;ToDo: Visualization for variational spaces&#10;Trajectory Coloring&#10;Post Processing&#10;Metric&#10;Slurm Skript">
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectId" id="1Omeu5sz43kySmz8qHfWIcA2dn0" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="PropertiesComponent">
<property name="ASKED_ADD_EXTERNAL_FILES" value="true" />
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/networks" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="settings.editor.selected.configurable" value="pyconsole" />
</component>
<component name="PyConsoleOptionsProvider">
<option name="myPythonConsoleState">
<console-settings module-name="ae_toolbox_torch" is-module-sdk="true">
<option name="myUseModuleSdk" value="true" />
<option name="myModuleName" value="ae_toolbox_torch" />
</console-settings>
</option>
<option name="myShowDebugConsoleByDefault" value="true" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\illium\Google Drive\LMU\Research\ae_toolbox_torch\networks" />
<recent name="C:\Users\illium\Google Drive\LMU\Research\ae_toolbox_torch\viz" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\illium\Google Drive\LMU\Research\ae_toolbox_torch\data\processed" />
<recent name="C:\Users\illium\Google Drive\LMU\Research\ae_toolbox_torch" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Python.viz_latent">
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
<module name="ae_toolbox_torch" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="true" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="run_basic_ae" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="ae_toolbox_torch" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="C:\Users\illium\Google Drive\LMU\Research\ae_toolbox_torch\run_models.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="true" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="run_models" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="ae_toolbox_torch" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/run_models.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="true" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="viz_latent" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="ae_toolbox_torch" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/viz" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/viz/viz_latent.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="true" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<list>
<item itemvalue="Python.run_basic_ae" />
<item itemvalue="Python.run_models" />
<item itemvalue="Python.viz_latent" />
</list>
<recent_temporary>
<list>
<item itemvalue="Python.viz_latent" />
<item itemvalue="Python.run_models" />
<item itemvalue="Python.run_basic_ae" />
</list>
</recent_temporary>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="5955480a-c876-43d5-afd7-8717f51f413e" name="Default Changelist" comment="" />
<created>1564587418949</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1564587418949</updated>
<workItem from="1564587420277" duration="6891000" />
<workItem from="1565364574595" duration="1092000" />
<workItem from="1565592214301" duration="53660000" />
<workItem from="1565793671730" duration="53351000" />
<workItem from="1566372837067" duration="28318000" />
</task>
<task id="LOCAL-00001" summary="Lightning integration basic ae, dataloaders and dataset">
<created>1565793753423</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1565793753423</updated>
</task>
<task id="LOCAL-00002" summary="Lightning integration basic ae, dataloaders and dataset">
<created>1565958589041</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1565958589041</updated>
</task>
<task id="LOCAL-00003" summary="Done: AE, VAE, AAE&#10;ToDo: Double AAE, Visualization&#10;All Modularized">
<created>1565987964760</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1565987964760</updated>
</task>
<task id="LOCAL-00004" summary="Done: AE, VAE, AAE&#10;ToDo: Double AAE, Visualization&#10;All Modularized">
<created>1566064016196</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1566064016196</updated>
</task>
<task id="LOCAL-00005" summary="Done: First VIsualization&#10;ToDo: Visualization for all classes, latent space setups">
<created>1566366992088</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1566366992088</updated>
</task>
<task id="LOCAL-00006" summary="Done: Latent Space Viz&#10;ToDo: Visualization for variational spaces&#10;Trajectory Coloring&#10;Post Processing&#10;Metric&#10;Slurm Skript">
<created>1566546840536</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1566546840536</updated>
</task>
<option name="localTasksCounter" value="7" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State>
<option name="COLUMN_ORDER" />
</State>
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="Lightning integration basic ae, dataloaders and dataset" />
<MESSAGE value="Done: AE, VAE, AAE&#10;ToDo: Double AAE, Visualization&#10;All Modularized" />
<MESSAGE value="Done: First VIsualization&#10;ToDo: Visualization for all classes, latent space setups" />
<MESSAGE value="Done: Latent Space Viz&#10;ToDo: Visualization for variational spaces&#10;Trajectory Coloring&#10;Post Processing&#10;Metric&#10;Slurm Skript" />
<option name="LAST_COMMIT_MESSAGE" value="Done: Latent Space Viz&#10;ToDo: Visualization for variational spaces&#10;Trajectory Coloring&#10;Post Processing&#10;Metric&#10;Slurm Skript" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/networks/modules.py</url>
<line>206</line>
<option name="timeStamp" value="51" />
</line-breakpoint>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/networks/seperating_adversarial_auto_encoder.py</url>
<line>23</line>
<option name="timeStamp" value="52" />
</line-breakpoint>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/viz/viz_latent.py</url>
<line>67</line>
<option name="timeStamp" value="56" />
</line-breakpoint>
</breakpoints>
<default-breakpoints>
<breakpoint type="python-exception">
<properties notifyOnlyOnFirst="true" notifyOnTerminate="true" ignoreLibraries="true" exception="BaseException">
<option name="ignoreLibraries" value="true" />
<option name="notifyOnTerminate" value="true" />
<option name="notifyOnlyOnFirst" value="true" />
</properties>
</breakpoint>
</default-breakpoints>
</breakpoint-manager>
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/ae_toolbox_torch$viz_latent.coverage" NAME="viz_latent Coverage Results" MODIFIED="1566541302103" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/viz" />
<SUITE FILE_PATH="coverage/ae_toolbox_torch$basic_ae_lightning_torch.coverage" NAME="basic_ae_lightning_torch Coverage Results" MODIFIED="1565937164457" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/ae_toolbox_torch$basic_ae_lightning.coverage" NAME="basic_ae_lightning Coverage Results" MODIFIED="1565956491159" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/ae_toolbox_torch$basic_vae_lightning.coverage" NAME="basic_vae_lightning Coverage Results" MODIFIED="1565955311009" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/ae_toolbox_torch$run_basic_ae.coverage" NAME="run_basic_ae Coverage Results" MODIFIED="1565966122607" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/ae_toolbox_torch$run_models.coverage" NAME="run_models Coverage Results" MODIFIED="1566537126647" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/ae_toolbox_torch$dataset.coverage" NAME="dataset Coverage Results" MODIFIED="1565772669750" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/data" />
</component>
</project>

View File

@ -167,7 +167,7 @@ class Trajectories(Dataset):
dataDict = dict() dataDict = dict()
for key, val in kwargs.items(): for key, val in kwargs.items():
if key in self.isovistMeasures: if key in self.isovistMeasures:
dataDict[key] = torch.tensor(val) dataDict[key] = torch.tensor(val, requires_grad=False)
# Check if all keys are of same length # Check if all keys are of same length
assert len(set(x.size()[0] for x in dataDict.values() if torch.is_tensor(x))) <= 1 assert len(set(x.size()[0] for x in dataDict.values() if torch.is_tensor(x))) <= 1
data = torch.stack([dataDict[key] for key in self.isovistMeasures], dim=-1) data = torch.stack([dataDict[key] for key in self.isovistMeasures], dim=-1)

View File

@ -1,7 +1,7 @@
from torch.optim import Adam
from networks.auto_encoder import AutoEncoder from networks.auto_encoder import AutoEncoder
from torch.nn.functional import mse_loss from torch.nn.functional import mse_loss
from torch.nn import Sequential, Linear, ReLU, Dropout, Sigmoid
from torch.distributions import Normal
from networks.modules import * from networks.modules import *
import torch import torch
@ -23,14 +23,10 @@ class AdversarialAutoEncoder(AutoEncoder):
return z, x_hat return z, x_hat
class AdversarialAELightningOverrides: class AdversarialAELightningOverrides(LightningModuleOverrides):
@property def __init__(self):
def name(self): super(AdversarialAELightningOverrides, self).__init__()
return self.__class__.__name__
def forward(self, x):
return self.network.forward(x)
def training_step(self, batch, _, optimizer_i): def training_step(self, batch, _, optimizer_i):
if optimizer_i == 0: if optimizer_i == 0:
@ -67,5 +63,12 @@ class AdversarialAELightningOverrides:
raise RuntimeError('This should not have happened, catch me if u can.') raise RuntimeError('This should not have happened, catch me if u can.')
# This is Fucked up, why do i need to put an additional empty list here?
def configure_optimizers(self):
return [Adam(self.network.discriminator.parameters(), lr=0.02),
Adam([*self.network.encoder.parameters(), *self.network.decoder.parameters()], lr=0.02)],\
[]
if __name__ == '__main__': if __name__ == '__main__':
raise PermissionError('Get out of here - never run this module') raise PermissionError('Get out of here - never run this module')

View File

@ -1,3 +1,5 @@
from torch.optim import Adam
from .modules import * from .modules import *
from torch.nn.functional import mse_loss from torch.nn.functional import mse_loss
from torch import Tensor from torch import Tensor
@ -26,14 +28,10 @@ class AutoEncoder(AbstractNeuralNetwork, ABC):
return z, x_hat return z, x_hat
class AutoEncoderLightningOverrides: class AutoEncoderLightningOverrides(LightningModuleOverrides):
@property def __init__(self):
def name(self): super(AutoEncoderLightningOverrides, self).__init__()
return self.__class__.__name__
def forward(self, x):
return self.network.forward(x)
def training_step(self, x, batch_nb): def training_step(self, x, batch_nb):
# z, x_hat # z, x_hat
@ -41,6 +39,9 @@ class AutoEncoderLightningOverrides:
loss = mse_loss(x, x_hat) loss = mse_loss(x, x_hat)
return {'loss': loss} return {'loss': loss}
def configure_optimizers(self):
return [Adam(self.parameters(), lr=0.02)]
if __name__ == '__main__': if __name__ == '__main__':
raise PermissionError('Get out of here - never run this module') raise PermissionError('Get out of here - never run this module')

View File

@ -1,11 +1,34 @@
import os
import torch import torch
import pytorch_lightning as pl import pytorch_lightning as pl
from torch.nn import Module, Linear, ReLU, Tanh, Sigmoid, Dropout, GRU, AvgPool2d from pytorch_lightning import data_loader
from torch.nn import Module, Linear, ReLU, Tanh, Sigmoid, Dropout, GRU
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
####################### #######################
# Abstract NN Class # Abstract NN Class & Lightning Module
from torch.utils.data import DataLoader
from dataset import DataContainer
class LightningModuleOverrides:
@property
def name(self):
return self.__class__.__name__
def forward(self, x):
return self.network.forward(x)
@data_loader
def tng_dataloader(self):
num_workers = os.cpu_count() // 2
return DataLoader(DataContainer('data', self.size, self.step),
shuffle=True, batch_size=100, num_workers=num_workers)
class AbstractNeuralNetwork(Module): class AbstractNeuralNetwork(Module):

View File

@ -1,3 +1,5 @@
from torch.optim import Adam
from networks.auto_encoder import AutoEncoder from networks.auto_encoder import AutoEncoder
from torch.nn.functional import mse_loss from torch.nn.functional import mse_loss
from networks.modules import * from networks.modules import *
@ -7,16 +9,15 @@ import torch
class SeperatingAdversarialAutoEncoder(Module): class SeperatingAdversarialAutoEncoder(Module):
def __init__(self, latent_dim, features, **kwargs): def __init__(self, latent_dim, features, **kwargs):
assert latent_dim % 2 == 0, f'Your latent space needs to be even, not odd, but was: "{latent_dim}"'
super(SeperatingAdversarialAutoEncoder, self).__init__() super(SeperatingAdversarialAutoEncoder, self).__init__()
self.latent_dim = latent_dim self.latent_dim = latent_dim
self.features = features self.features = features
self.spatial_encoder = PoolingEncoder(self.latent_dim // 2) self.spatial_encoder = PoolingEncoder(self.latent_dim)
self.temporal_encoder = Encoder(self.latent_dim // 2) self.temporal_encoder = Encoder(self.latent_dim)
self.decoder = Decoder(self.latent_dim, self.features) self.decoder = Decoder(self.latent_dim, self.features)
self.spatial_discriminator = Discriminator(self.latent_dim // 2, self.features) self.spatial_discriminator = Discriminator(self.latent_dim, self.features)
self.temporal_discriminator = Discriminator(self.latent_dim // 2, self.features) self.temporal_discriminator = Discriminator(self.latent_dim, self.features)
def forward(self, batch): def forward(self, batch):
# Encoder # Encoder
@ -30,14 +31,10 @@ class SeperatingAdversarialAutoEncoder(Module):
return z_spatial, z_temporal, x_hat return z_spatial, z_temporal, x_hat
class SeparatingAdversarialAELightningOverrides: class SeparatingAdversarialAELightningOverrides(LightningModuleOverrides):
@property def __init__(self):
def name(self): super(SeparatingAdversarialAELightningOverrides, self).__init__()
return self.__class__.__name__
def forward(self, x):
return self.network.forward(x)
def training_step(self, batch, _, optimizer_i): def training_step(self, batch, _, optimizer_i):
spatial_latent_fake, temporal_latent_fake, batch_hat = self.network.forward(batch) spatial_latent_fake, temporal_latent_fake, batch_hat = self.network.forward(batch)
@ -91,6 +88,17 @@ class SeparatingAdversarialAELightningOverrides:
else: else:
raise RuntimeError('This should not have happened, catch me if u can.') raise RuntimeError('This should not have happened, catch me if u can.')
# This is Fucked up, why do i need to put an additional empty list here?
def configure_optimizers(self):
return [Adam([*self.network.spatial_discriminator.parameters(), *self.network.spatial_encoder.parameters()]
, lr=0.02),
Adam([*self.network.temporal_discriminator.parameters(), *self.network.temporal_encoder.parameters()]
, lr=0.02),
Adam([*self.network.temporal_encoder.parameters(),
*self.network.spatial_encoder.parameters(),
*self.network.decoder.parameters()]
, lr=0.02)], []
if __name__ == '__main__': if __name__ == '__main__':
raise PermissionError('Get out of here - never run this module') raise PermissionError('Get out of here - never run this module')

View File

@ -1,3 +1,5 @@
from torch.optim import Adam
from .modules import * from .modules import *
from torch.nn.functional import mse_loss from torch.nn.functional import mse_loss
@ -33,14 +35,10 @@ class VariationalAutoEncoder(AbstractNeuralNetwork, ABC):
return x_hat, mu, logvar return x_hat, mu, logvar
class VariationalAutoEncoderLightningOverrides: class VariationalAutoEncoderLightningOverrides(LightningModuleOverrides):
@property def __init__(self):
def name(self): super(VariationalAutoEncoderLightningOverrides, self).__init__()
return self.network.name
def forward(self, x):
return self.network.forward(x)
def training_step(self, x, _): def training_step(self, x, _):
x_hat, logvar, mu = self.forward(x) x_hat, logvar, mu = self.forward(x)
@ -53,6 +51,9 @@ class VariationalAutoEncoderLightningOverrides:
KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return {'loss': BCE + KLD} return {'loss': BCE + KLD}
def configure_optimizers(self):
return [Adam(self.parameters(), lr=0.02)]
if __name__ == '__main__': if __name__ == '__main__':
raise PermissionError('Get out of here - never run this module') raise PermissionError('Get out of here - never run this module')

View File

@ -1,3 +1,5 @@
from torch.distributions import Normal
from networks.auto_encoder import * from networks.auto_encoder import *
import os import os
import time import time
@ -18,90 +20,54 @@ from argparse import Namespace
from argparse import ArgumentParser from argparse import ArgumentParser
args = ArgumentParser() args = ArgumentParser()
args.add_argument('step') args.add_argument('--step', default=0)
args.add_argument('features') args.add_argument('--features', default=0)
args.add_argument('size') args.add_argument('--size', default=0)
args.add_argument('latent_dim') args.add_argument('--latent_dim', default=0)
args.add_argument('--model', default='Model')
# ToDo: How to implement this better? # ToDo: How to implement this better?
# other_classes = [AutoEncoder, AutoEncoderLightningOverrides] # other_classes = [AutoEncoder, AutoEncoderLightningOverrides]
class Model(AutoEncoderLightningOverrides, LightningModule): class Model(AutoEncoderLightningOverrides, LightningModule):
def __init__(self, latent_dim=0, size=0, step=0, features=0, **kwargs): def __init__(self, parameters, **kwargs):
assert all([x in args for x in ['step', 'size', 'latent_dim', 'features']]) assert all([x in parameters for x in ['step', 'size', 'latent_dim', 'features']])
self.size = args.size self.size = parameters.size
self.latent_dim = args.latent_dim self.latent_dim = parameters.latent_dim
self.features = args.features self.features = parameters.features
self.step = args.step self.step = parameters.step
super(Model, self).__init__() super(Model, self).__init__()
self.network = AutoEncoder(self.latent_dim, self.features) self.network = AutoEncoder(self.latent_dim, self.features)
def configure_optimizers(self):
return [Adam(self.parameters(), lr=0.02)]
@data_loader
def tng_dataloader(self):
return DataLoader(DataContainer('data', self.size, self.step), shuffle=True, batch_size=100)
class AdversarialModel(AdversarialAELightningOverrides, LightningModule): class AdversarialModel(AdversarialAELightningOverrides, LightningModule):
@property def __init__(self, parameters: Namespace, **kwargs):
def name(self): assert all([x in parameters for x in ['step', 'size', 'latent_dim', 'features']])
return self.network.name self.size = parameters.size
self.latent_dim = parameters.latent_dim
def __init__(self, args: Namespace, **kwargs): self.features = parameters.features
assert all([x in args for x in ['step', 'size', 'latent_dim', 'features']]) self.step = parameters.step
self.size = args.size
self.latent_dim = args.latent_dim
self.features = args.features
self.step = args.step
super(AdversarialModel, self).__init__() super(AdversarialModel, self).__init__()
self.normal = Normal(0, 1) self.normal = Normal(0, 1)
self.network = AdversarialAutoEncoder(self.latent_dim, self.features) self.network = AdversarialAutoEncoder(self.latent_dim, self.features)
pass pass
# This is Fucked up, why do i need to put an additional empty list here?
def configure_optimizers(self):
return [Adam(self.network.discriminator.parameters(), lr=0.02),
Adam([*self.network.encoder.parameters(), *self.network.decoder.parameters()], lr=0.02)],\
[]
@data_loader
def tng_dataloader(self):
return DataLoader(DataContainer('data', self.size, self.step), shuffle=True, batch_size=100)
class SeparatingAdversarialModel(SeparatingAdversarialAELightningOverrides, LightningModule): class SeparatingAdversarialModel(SeparatingAdversarialAELightningOverrides, LightningModule):
def __init__(self, args: Namespace, **kwargs): def __init__(self, parameters: Namespace, **kwargs):
assert all([x in args for x in ['step', 'size', 'latent_dim', 'features']]) assert all([x in parameters for x in ['step', 'size', 'latent_dim', 'features']])
self.size = args.size self.size = parameters.size
self.latent_dim = args.latent_dim self.latent_dim = parameters.latent_dim
self.features = args.features self.features = parameters.features
self.step = args.step self.step = parameters.step
super(SeparatingAdversarialModel, self).__init__() super(SeparatingAdversarialModel, self).__init__()
self.normal = Normal(0, 1) self.normal = Normal(0, 1)
self.network = SeperatingAdversarialAutoEncoder(self.latent_dim, self.features, **kwargs) self.network = SeperatingAdversarialAutoEncoder(self.latent_dim, self.features, **kwargs)
pass pass
# This is Fucked up, why do i need to put an additional empty list here?
def configure_optimizers(self):
return [Adam([*self.network.spatial_discriminator.parameters(), *self.network.spatial_encoder.parameters()]
, lr=0.02),
Adam([*self.network.temporal_discriminator.parameters(), *self.network.temporal_encoder.parameters()]
, lr=0.02),
Adam([*self.network.temporal_encoder.parameters(),
*self.network.spatial_encoder.parameters(),
*self.network.decoder.parameters()]
, lr=0.02)], []
@data_loader
def tng_dataloader(self):
num_workers = os.cpu_count() // 2
return DataLoader(DataContainer('data', self.size, self.step), shuffle=True, batch_size=100, num_workers=num_workers)
if __name__ == '__main__': if __name__ == '__main__':
features = 6 features = 6
@ -110,7 +76,7 @@ if __name__ == '__main__':
arguments = args.parse_args() arguments = args.parse_args()
arguments.__dict__.update(tag_dict) arguments.__dict__.update(tag_dict)
model = SeparatingAdversarialModel(arguments) model = globals()[arguments.model](arguments)
# PyTorch summarywriter with a few bells and whistles # PyTorch summarywriter with a few bells and whistles
outpath = os.path.join(os.getcwd(), 'output', model.name, time.asctime().replace(' ', '_').replace(':', '-')) outpath = os.path.join(os.getcwd(), 'output', model.name, time.asctime().replace(' ', '_').replace(':', '-'))
@ -124,7 +90,7 @@ if __name__ == '__main__':
filepath=os.path.join(outpath, 'weights.ckpt'), filepath=os.path.join(outpath, 'weights.ckpt'),
save_best_only=True, save_best_only=True,
verbose=True, verbose=True,
monitor='tng_loss', # val_loss monitor='val_loss', # val_loss
mode='min', mode='min',
) )

View File

@ -1,21 +1,17 @@
# TODO: THIS
import seaborn as sb
import torch
from torch.utils.data import DataLoader
from pytorch_lightning import data_loader
from dataset import DataContainer
from collections import defaultdict from collections import defaultdict
from tqdm import tqdm from tqdm import tqdm
import os
from sklearn.manifold import TSNE from sklearn.manifold import TSNE
from sklearn.decomposition import PCA from sklearn.decomposition import PCA
import seaborn as sns; sns.set() import seaborn as sns
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from run_models import * from run_models import *
sns.set()
def search_for_weights(folder): def search_for_weights(folder):
while not os.path.exists(folder): while not os.path.exists(folder):
if len(os.path.split(folder)) >= 50: if len(os.path.split(folder)) >= 50:
@ -32,6 +28,8 @@ def search_for_weights(folder):
def load_and_predict(path_like_element): def load_and_predict(path_like_element):
if any([x.name.endswith('.png') for x in os.scandir(os.path.dirname(path_like_element))]):
return
# Define Loop to search for models and folder with visualizations # Define Loop to search for models and folder with visualizations
model = globals()[path_like_element.path.split(os.sep)[-3]] model = globals()[path_like_element.path.split(os.sep)[-3]]
@ -46,36 +44,50 @@ def load_and_predict(path_like_element):
pretrained_model.eval() pretrained_model.eval()
pretrained_model.freeze() pretrained_model.freeze()
# Load the data for prediction with torch.no_grad():
dataset = DataContainer(os.path.join(os.pardir, 'data'), 5, 5)
# Do the inference # Load the data for prediction
prediction_dict = defaultdict(list) dataset = DataContainer(os.path.join(os.pardir, 'data'), 5, 5)
for i in tqdm(range(len(dataset)), total=len(dataset)):
p_X = pretrained_model(dataset[i].unsqueeze(0)) # Do the inference
for idx in range(len(p_X) - 1): prediction_dict = defaultdict(list)
prediction_dict[idx].append(p_X[idx]) for i in tqdm(range(len(dataset)), total=len(dataset)):
p_X = pretrained_model(dataset[i].unsqueeze(0))
for idx in range(len(p_X) - 1):
prediction_dict[idx].append(p_X[idx])
predictions = [torch.cat(prediction).detach().numpy() for prediction in prediction_dict.values()] predictions = [torch.cat(prediction).detach().numpy() for prediction in prediction_dict.values()]
for prediction in predictions: for idx, prediction in enumerate(predictions):
viz_latent(prediction) plot, _ = viz_latent(prediction)
plot.savefig(os.path.join(os.path.dirname(path_like_element), f'latent_space_{idx}.png'))
def viz_latent(prediction): def viz_latent(prediction, title=f'Latent Space '):
if prediction.shape[-1] <= 1: if prediction.shape[-1] <= 1:
raise ValueError('How did this happen?') raise ValueError('How did this happen?')
elif prediction.shape[-1] == 2: elif prediction.shape[-1] == 2:
ax = sns.scatterplot(x=prediction[:, 0], y=prediction[:, 1]) ax = sns.scatterplot(x=prediction[:, 0], y=prediction[:, 1])
plt.show() try:
return ax plt.show()
except:
pass
return ax.figure, (ax)
else: else:
fig, axs = plt.subplots(ncols=2) fig, axs = plt.subplots(ncols=2)
predictions_pca = PCA(n_components=2) plots = []
predictions_tsne = TSNE(n_components=2) for idx, dim_reducer in enumerate([PCA, TSNE]):
pca_plot = sns.scatterplot(x=predictions_pca[:, 0], y=predictions_pca[:, 1], ax=axs[0]) predictions_reduced = dim_reducer(n_components=2).fit_transform(prediction)
tsne_plot = sns.scatterplot(x=predictions_tsne[:, 0], y=predictions_tsne[:, 1], ax=axs[1]) plot = sns.scatterplot(x=predictions_reduced[:, 0], y=predictions_reduced[:, 1],
plt.show() ax=axs[idx])
return fig, axs, pca_plot, tsne_plot plot.set_title(dim_reducer.__name__)
plots.append(plot)
try:
plt.show()
except:
pass
return fig, (*plots, )
if __name__ == '__main__': if __name__ == '__main__':
path = 'output' path = 'output'