Skip to content

rickywesker/LearningDL

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

LearningDL

SvAm Softmax Linear

#SV-AM-Softmax class SVAMLinear(torch.nn.Module): def __init__(self, in_channels, num_class, t = 1.2, m = 0.35, scale = 30): super(SVLinear,self).__init__() self.in_channels = in_channels self.num_class = num_class self.t = t self.m = m self.scale = scale self.weights = Parameter(torch.Tensor(in_channels, num_class)) self.weights.data.uniform_(-1,1).renorm(2,1,1e-5).mul(1e5) def forward(self,input,target): norm_weights = F.normalize(self.weights,dim=0) cos_theta = torch.mm(input,norm_weights)#test batch_size = target.size(0) gtScore = cos_theta[torch.arange(0,batch_size),target].view(-1,1) mask = cos_theta > (gtScore - self.m) finalScore = torch.where(gtScore > self.m, gtScore - self.m,gtScore) hardEx = cos_theta[mask] cos_theta[mask] = self.t * hardEx + self.t - 1.0 cos_theta.scatter_(1, target.data.view(-1,1),finalScore) cos_theta *= self.scale return cos_theta

Full Connected NN

import math def sigmoid(x): return 1 / (1 + math.exp(-x)) class Node(object): def __init__(self,layer_index,node_index): self.layer_index = layer_index self.node_index = node_index self.upstream = [] self.downstream = [] self.output = 0 self.delta = 0 def set_output(self,output): self.output = output def set_delta(self,delta): self.delta = delta def downstream_append(self,conn): self.downstream.append(conn) def upstream_append(self,conn): self.upstream.append(conn) def calc_output(self): output = reduce(lambda ret,conn:ret + conn.upstream_node.output * conn.weight,self.upstream,0) self.output = sigmoid(output) def calc_hidden_layer_delta(self):#hidden layer downstream_delta = reduce(lambda ret,conn:ret + conn.downstream_node.delta * conn.weight,self.downstream,0.0) self.delta = self.output * (1 - self.output) * downstream_delta def calc_output_layer_delta(self,label): self.delta = self.output * (1 - self.output) * (label - self.output) def __str__(self): node_str = "%u-%u:output:%f delta:%f" %(self.layer_index,self.node_index,self.output,self.delta) downstream_str = reduce(lambda ret,conn:ret + '\n\t' + str(conn),self.downstream,'') upstream_str = reduce(lambda ret,conn:ret + '\n\t' + str(conn),self.upstream,'') return node_str + '\n\tdownstream:' + downstream_str + '\n\tupstream:' + upstream_str class ConstNode(object): def __init__(self,layer_index,node_index): self.layer_index = layer_index self.node_index = node_index self.downstream = [] self.output = 1 def downstream_append(self,conn): self.downstream.append(conn) def set_delta(self): downstream_delta = reduce(lambda ret,conn:ret + conn.downstream_node.delta * conn.weight,downstream_delta,0.0) self.delta = self.output * (1 - self.output) * downstream_delta def __str__(self): node_str = '%u-%u:output:1 delta:%f' % (self.layer_index,self.node_index,self.delta) downstream_str = reduce(lambda ret,conn:ret + '\n\t' + str(node),self.downstream,'') return node_str + '\n\tdownstream:' + downstream_str class Layer(object): def __init__(self,layer_index,node_count): self.layer_index = layer_index self.node_count = node_count self.nodes = [] for i in range(self.node_count): self.nodes.append(Node(layer_index,i)) self.nodes.append(ConstNode(layer_index,self.node_count)) def set_output(self,data):#input layer x1,x2,x3... for i in range(len(data)): self.nodes[i].set_output(data[i]) def calc_output(self): for node in self.nodes[:-1]: node.calc_output() def dump(self): for node in self.nodes print(node) class Connection(object): def __init__(self,upstream_node,downstream_node): self.upstream_node = upstream_node self.downstream_node = downstream_node self.weight = random.uniform(-0.1,0.1) self.gradient = 0.0 def calc_gradient(self): self.gradient = self.downstream_node.delta * self.upstream_node.output def get_gradient(self): return self.gradient def update_weight(self,rate): calc_gradient() self.weight += self.gradient * rate def __str__(self): return '(%u-%u) -> (%u-%u) = %f' % ( self.upstream_node.layer_index, self.upstream_node.node_index, self.downstream_node.layer_index, self.downstream_node.node_index, self.weight ) class Connections(object): def __init__(self): self.connections = [] def connection_append(self,conn): self.connections.append(conn) def dump(self): for conn in self.connections: print(conn) class Network(object): def __init__(self,layers):#layers[i] <----> # of nodes in layer i self.connections = Connections() self.layers = [] layer_count = len(layers) node_count = 0 #how many layers? for i in range(layer_count): self.layers.append(Layer(i,layers[i])) for layer in range(layer_count - 1): connections = [Connection(upstream_node,downstream_node) for upstream_node in self.layers[layer].nodes for downstream_node in self.layers[layer+1].nodes[:-1]] #cant get it? #temp = [Node(a,b) #for a in [1,2,3,4,5] #for b in [2,4,6,8]]  for conn in connections: self.connections.add_connection(conn) conn.downstream_node.upstream_append(conn) conn.upstream_node.downstream_append(conn) 

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages