-
-
Save yakreved/10516843 to your computer and use it in GitHub Desktop.
thm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Network | |
attr_accessor :columns, :neurons_in_column,:connectedPerm,:desiredLocalActivity | |
def initialize | |
@minOverlap = 5 | |
@neurons_in_column = 5 | |
@connectedPerm = 0.5 #пороговое значение – минимальное значение перманентности при котором синапс считается «действующим» («подключенным») | |
@columns = Array.new(10){Column.new} | |
@desiredLocalActivity = 3 #Параметр контролирующий число колонок победителей после шага подавления. | |
end | |
class Neuron | |
attr_accessor :synapse | |
def initialize | |
@synapse = Synapse.new | |
end | |
end | |
class Synapse | |
attr_accessor :input_source, :permanence | |
def initialize | |
@input_source = -1 #индекс элемента входа, с которым связан синапс | |
@permanence = rand | |
end | |
end | |
class Column | |
attr_accessor :overlap,:neurons, :boost | |
def initialize | |
@neurons = Array.new(1){Neuron.new} | |
@overlap = 0 | |
@boost = 1 | |
end | |
def connectedSynapses | |
res = [] | |
@neurons.each do |n| | |
if n.synapse.permanence>= 0.5#connectedPerm | |
res.push(n.synapse) | |
end | |
end | |
res | |
end | |
def disconnectedSynapses | |
res = [] | |
@neurons.each do |n| | |
if n.synapse.permanence< connectedPerm | |
res.push(n.synapse) | |
end | |
end | |
res | |
end | |
end | |
#Присоединяем синапсы к входным данным (Раз и навсегда) | |
def connectNetworkToInputs(size) | |
for i in 0 .. size -1 do | |
@columns.sample.neurons.sample.synapse.input_source = i | |
end | |
end | |
#Имплементация пространственного группировщика | |
def spaceGrouper(input) | |
#1.Overlap | |
def overlap(input) | |
@columns.each do |c| | |
c.overlap = 0 | |
c.connectedSynapses.each do |s| | |
c.overlap = c.overlap + input[s.input_source] | |
end | |
if c.overlap < 1 then c.overlap =0 #5 = minOverlap | |
else | |
c.overlap= c.overlap*c.boost | |
end | |
end | |
end | |
#2.Ингибирование (подавление) | |
def ingibit | |
activeColumns = [] | |
@columns.each do |c| | |
minLocalActivity = kthScore(neighbors(c), @desiredLocalActivity) | |
if c.overlap>0 and c.overlap>= minLocalActivity | |
activeColumns.push(c) | |
end | |
end | |
activeColumns | |
end | |
#Для заданного списка колонок возвращает их k-ое максимальное значение их перекрытий со входом. | |
def kthScore(colls,desiredLocalActivity) | |
if colls.length> desiredLocalActivity | |
colls.sort_by{|p| p.overlap}[desiredLocalActivity].overlap | |
else | |
colls.last.overlap | |
end | |
end | |
#Список колонок находящихся в радиусе подавления inhibitionRadius колонки c. | |
def neighbors(c) | |
@columns.slice(@columns.index(c)-10,@columns.index(c)+10) | |
end | |
#Фаза 3: Обучение | |
def learn(activeColumns) | |
activeColumns.each do |c| | |
c.connectedSynapses.each do |s| | |
s.permanence+= 0.1#permanenceInc | |
s.permanence = [1, s.permanence].min | |
end | |
c.connectedSynapses.each do |s| | |
s.permanence -= 0.1#permanenceDec | |
s.permanence = [0, s.permanence].max | |
end | |
#Здесь возможно будет заимплементено ускорение | |
end | |
end | |
overlap(input) | |
learn(ingibit) | |
end | |
end | |
#Testing | |
data = [1,0,1,0,1,0] | |
data2 = [0,1,0,1,0,1] | |
data3 = [1,1,0,1,0,1] | |
n = Network.new | |
n.connectNetworkToInputs(data.length) | |
n.spaceGrouper(data) | |
n.spaceGrouper(data2) | |
n.spaceGrouper(data) | |
n.spaceGrouper(data2) | |
n.spaceGrouper(data) | |
n.ingibit.map { |p| puts p.neurons[0].synapse.input_source } | |
p "////" | |
n.spaceGrouper(data2) | |
n.ingibit.map { |p| puts p.neurons[0].synapse.input_source } | |
p "////" | |
n.spaceGrouper(data3) | |
n.ingibit.map { |p| puts p.neurons[0].synapse.input_source } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment