nlomov's picture
Added all source code
ab33b80
Raw
History Blame Contribute Delete
5.21 kB
from collections import OrderedDict
from torch import nn
import torch
class ContextualInferenceNetwork(nn.Module):
"""Inference Network."""
def __init__(self, input_size, bert_size, output_size, hidden_sizes,
activation='softplus', dropout=0.2, label_size=0):
"""
# TODO: check dropout in main caller
Initialize InferenceNetwork.
Args
input_size : int, dimension of input
output_size : int, dimension of output
hidden_sizes : tuple, length = n_layers
activation : string, 'softplus' or 'relu', default 'softplus'
dropout : float, default 0.2, default 0.2
"""
super(ContextualInferenceNetwork, self).__init__()
assert isinstance(input_size, int), "input_size must by type int."
assert isinstance(output_size, int), "output_size must be type int."
assert isinstance(hidden_sizes, tuple), \
"hidden_sizes must be type tuple."
assert activation in ['softplus', 'relu'], \
"activation must be 'softplus' or 'relu'."
assert dropout >= 0, "dropout must be >= 0."
self.input_size = input_size
self.output_size = output_size
self.hidden_sizes = hidden_sizes
self.dropout = dropout
if activation == 'softplus':
self.activation = nn.Softplus()
elif activation == 'relu':
self.activation = nn.ReLU()
self.input_layer = nn.Linear(bert_size + label_size, hidden_sizes[0])
#self.adapt_bert = nn.Linear(bert_size, hidden_sizes[0])
self.hiddens = nn.Sequential(OrderedDict([
('l_{}'.format(i), nn.Sequential(nn.Linear(h_in, h_out), self.activation))
for i, (h_in, h_out) in enumerate(zip(hidden_sizes[:-1], hidden_sizes[1:]))]))
self.f_mu = nn.Linear(hidden_sizes[-1], output_size)
self.f_mu_batchnorm = nn.BatchNorm1d(output_size, affine=False)
self.f_sigma = nn.Linear(hidden_sizes[-1], output_size)
self.f_sigma_batchnorm = nn.BatchNorm1d(output_size, affine=False)
self.dropout_enc = nn.Dropout(p=self.dropout)
def forward(self, x, x_bert, labels=None):
"""Forward pass."""
x = x_bert
if labels:
x = torch.cat((x_bert, labels), 1)
x = self.input_layer(x)
x = self.activation(x)
x = self.hiddens(x)
x = self.dropout_enc(x)
mu = self.f_mu_batchnorm(self.f_mu(x))
log_sigma = self.f_sigma_batchnorm(self.f_sigma(x))
return mu, log_sigma
class CombinedInferenceNetwork(nn.Module):
"""Inference Network."""
def __init__(self, input_size, bert_size, output_size, hidden_sizes,
activation='softplus', dropout=0.2, label_size=0):
"""
Initialize InferenceNetwork.
Args
input_size : int, dimension of input
output_size : int, dimension of output
hidden_sizes : tuple, length = n_layers
activation : string, 'softplus' or 'relu', default 'softplus'
dropout : float, default 0.2, default 0.2
"""
super(CombinedInferenceNetwork, self).__init__()
assert isinstance(input_size, int), "input_size must by type int."
assert isinstance(output_size, int), "output_size must be type int."
assert isinstance(hidden_sizes, tuple), \
"hidden_sizes must be type tuple."
assert activation in ['softplus', 'relu'], \
"activation must be 'softplus' or 'relu'."
assert dropout >= 0, "dropout must be >= 0."
self.input_size = input_size
self.output_size = output_size
self.hidden_sizes = hidden_sizes
self.dropout = dropout
if activation == 'softplus':
self.activation = nn.Softplus()
elif activation == 'relu':
self.activation = nn.ReLU()
self.adapt_bert = nn.Linear(bert_size, input_size)
#self.bert_layer = nn.Linear(hidden_sizes[0], hidden_sizes[0])
self.input_layer = nn.Linear(input_size + input_size + label_size, hidden_sizes[0])
self.hiddens = nn.Sequential(OrderedDict([
('l_{}'.format(i), nn.Sequential(nn.Linear(h_in, h_out), self.activation))
for i, (h_in, h_out) in enumerate(zip(hidden_sizes[:-1], hidden_sizes[1:]))]))
self.f_mu = nn.Linear(hidden_sizes[-1], output_size)
self.f_mu_batchnorm = nn.BatchNorm1d(output_size, affine=False)
self.f_sigma = nn.Linear(hidden_sizes[-1], output_size)
self.f_sigma_batchnorm = nn.BatchNorm1d(output_size, affine=False)
self.dropout_enc = nn.Dropout(p=self.dropout)
def forward(self, x, x_bert, labels=None):
"""Forward pass."""
x_bert = self.adapt_bert(x_bert)
x = torch.cat((x, x_bert), 1)
if labels is not None:
x = torch.cat((x, labels), 1)
x = self.input_layer(x)
x = self.activation(x)
x = self.hiddens(x)
x = self.dropout_enc(x)
mu = self.f_mu_batchnorm(self.f_mu(x))
log_sigma = self.f_sigma_batchnorm(self.f_sigma(x))
return mu, log_sigma