Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/nplm.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'python/nplm.py')
-rw-r--r--[-rwxr-xr-x]python/nplm.py94
1 files changed, 24 insertions, 70 deletions
diff --git a/python/nplm.py b/python/nplm.py
index 473ae02..2564bf8 100755..100644
--- a/python/nplm.py
+++ b/python/nplm.py
@@ -12,31 +12,21 @@ def diag_dot(a, b, out=None):
return out
class NeuralLM(object):
- def __init__(self, ngram_size, input_vocab_size, output_vocab_size, input_embedding_dimension, num_hidden, output_embedding_dimension, activation_function):
- self.input_vocab_size = input_vocab_size
- self.output_vocab_size = output_vocab_size
+ def __init__(self, ngram_size, n_vocab, input_embedding_dimension, n_hidden, output_embedding_dimension):
+ self.n_vocab = n_vocab
self.index_to_word = []
- self.index_to_word_input = []
- self.index_to_word_output = []
self.word_to_index = {}
- self.word_to_index_input = {}
- self.word_to_index_output = {}
self.ngram_size = ngram_size
self.input_embedding_dimension = input_embedding_dimension
- self.num_hidden = num_hidden
+ self.n_hidden = n_hidden
self.output_embedding_dimension = output_embedding_dimension
- self.activation_function = activation_function
- self.input_embeddings = numpy.zeros((input_vocab_size, input_embedding_dimension))
- if not num_hidden:
- self.hidden1_weights = numpy.zeros((output_embedding_dimension, (ngram_size-1)*input_embedding_dimension))
- self.hidden2_weights = numpy.zeros((1, 1))
- else:
- self.hidden1_weights = numpy.zeros((num_hidden, (ngram_size-1)*input_embedding_dimension))
- self.hidden2_weights = numpy.zeros((output_embedding_dimension, num_hidden))
- self.output_weights = numpy.zeros((output_vocab_size, output_embedding_dimension))
- self.output_biases = numpy.zeros((output_vocab_size, 1))
+ self.input_embeddings = numpy.zeros((n_vocab, input_embedding_dimension))
+ self.hidden1_weights = numpy.zeros((n_hidden, (ngram_size-1)*input_embedding_dimension))
+ self.hidden2_weights = numpy.zeros((output_embedding_dimension, n_hidden))
+ self.output_weights = numpy.zeros((n_vocab, output_embedding_dimension))
+ self.output_biases = numpy.zeros((n_vocab, 1))
def initialize(self, r):
def uniform(m):
@@ -50,10 +40,7 @@ class NeuralLM(object):
def forward_prop(self, inputs, output=None, normalize=True):
u = numpy.bmat([[self.input_embeddings.T * ui] for ui in inputs])
h1 = numpy.maximum(0., self.hidden1_weights * u)
- if not self.num_hidden:
- h2 = h1
- else:
- h2 = numpy.maximum(0., self.hidden2_weights * h1)
+ h2 = numpy.maximum(0., self.hidden2_weights * h1)
if output is None:
o = self.output_weights * h2 + self.output_biases
@@ -88,30 +75,16 @@ class NeuralLM(object):
outfile.write("\\config\n")
outfile.write("version 1\n")
outfile.write("ngram_size %d\n" % self.ngram_size)
- outfile.write("input_vocab_size %d\n" % self.input_vocab_size)
- outfile.write("output_vocab_size %d\n" % self.output_vocab_size)
+ outfile.write("n_vocab %d\n" % self.n_vocab)
outfile.write("input_embedding_dimension %d\n" % self.input_embedding_dimension)
- outfile.write("num_hidden %d\n" % self.num_hidden)
outfile.write("output_embedding_dimension %d\n" % self.output_embedding_dimension)
- outfile.write("activation_function %s\n" % self.activation_function)
+ outfile.write("n_hidden %d\n" % self.n_hidden)
outfile.write("\n")
- if self.index_to_word_input and self.index_to_word_output:
- outfile.write("\\input_vocab\n")
- for word in self.index_to_word_input:
- outfile.write(word + "\n")
- outfile.write("\n")
-
- outfile.write("\\output_vocab\n")
- for word in self.index_to_word_output:
- outfile.write(word + "\n")
- outfile.write("\n")
-
- elif self.index_to_word:
- outfile.write("\\vocab\n")
- for word in self.index_to_word:
- outfile.write(word + "\n")
- outfile.write("\n")
+ outfile.write("\\vocab\n")
+ for word in self.index_to_word:
+ outfile.write(word + "\n")
+ outfile.write("\n")
outfile.write("\\input_embeddings\n")
write_matrix(self.input_embeddings)
@@ -178,22 +151,10 @@ class NeuralLM(object):
config[key] = value
m = NeuralLM(ngram_size=int(config['ngram_size']),
- input_vocab_size=int(config['input_vocab_size']),
- output_vocab_size=int(config['output_vocab_size']),
+ n_vocab=int(config['n_vocab']),
input_embedding_dimension=int(config['input_embedding_dimension']),
- num_hidden=int(config['num_hidden']),
- output_embedding_dimension=int(config['output_embedding_dimension']),
- activation_function=config['activation_function'])
-
- elif section == "\\input_vocab":
- for line in lines:
- m.index_to_word_input.append(line)
- m.word_to_index_input = dict((w,i) for (i,w) in enumerate(m.index_to_word_input))
-
- elif section == "\\output_vocab":
- for line in lines:
- m.index_to_word_output.append(line)
- m.word_to_index_output = dict((w,i) for (i,w) in enumerate(m.index_to_word_output))
+ n_hidden=int(config['n_hidden']),
+ output_embedding_dimension=int(config['output_embedding_dimension']))
elif section == "\\vocab":
for line in lines:
@@ -201,21 +162,15 @@ class NeuralLM(object):
m.word_to_index = dict((w,i) for (i,w) in enumerate(m.index_to_word))
elif section == "\\input_embeddings":
- read_matrix(lines, m.input_vocab_size, m.input_embedding_dimension, out=m.input_embeddings)
+ read_matrix(lines, m.n_vocab, m.input_embedding_dimension, out=m.input_embeddings)
elif section == "\\hidden_weights 1":
- if not m.num_hidden:
- read_matrix(lines, m.output_embedding_dimension, (m.ngram_size-1)*m.input_embedding_dimension, out=m.hidden1_weights)
- else:
- read_matrix(lines, m.num_hidden, (m.ngram_size-1)*m.input_embedding_dimension, out=m.hidden1_weights)
+ read_matrix(lines, m.n_hidden, (m.ngram_size-1)*m.input_embedding_dimension, out=m.hidden1_weights)
elif section == "\\hidden_weights 2":
- if not m.num_hidden:
- read_matrix(lines, 1, 1, out=m.hidden2_weights)
- else:
- read_matrix(lines, m.output_embedding_dimension, m.num_hidden, out=m.hidden2_weights)
+ read_matrix(lines, m.output_embedding_dimension, m.n_hidden, out=m.hidden2_weights)
elif section == "\\output_weights":
- read_matrix(lines, m.output_vocab_size, m.output_embedding_dimension, out=m.output_weights)
+ read_matrix(lines, m.n_vocab, m.output_embedding_dimension, out=m.output_weights)
elif section == "\\output_biases":
- read_matrix(lines, m.output_vocab_size, 1, out=m.output_biases)
+ read_matrix(lines, m.n_vocab, 1, out=m.output_biases)
return m
def make_data(self, ngrams):
@@ -229,6 +184,5 @@ class NeuralLM(object):
rows[j].append(w)
cols[j].append(i)
values[j].append(1)
- data = [scipy.sparse.csc_matrix((values[j], (rows[j], cols[j])), shape=(self.input_vocab_size, len(ngrams))) for j in xrange(self.ngram_size-1)]
- data.append(scipy.sparse.csc_matrix((values[-1], (rows[-1], cols[-1])), shape=(self.output_vocab_size, len(ngrams))))
+ data = [scipy.sparse.csc_matrix((values[j], (rows[j], cols[j])), shape=(self.n_vocab, len(ngrams))) for j in xrange(self.ngram_size)]
return data