79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
import logging
|
|
from itertools import combinations, islice
|
|
|
|
import numpy as np
|
|
|
|
try:
|
|
from sklearn.model_selection import train_test_split
|
|
except ImportError:
|
|
from sklearn.cross_validation import train_test_split
|
|
|
|
from mla.metrics import accuracy
|
|
from mla.neuralnet import NeuralNet
|
|
from mla.neuralnet.layers import Activation, TimeDistributedDense
|
|
from mla.neuralnet.layers.recurrent import LSTM
|
|
from mla.neuralnet.optimizers import Adam
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
|
|
def addition_dataset(dim=10, n_samples=10000, batch_size=64):
|
|
"""Generate binary addition dataset.
|
|
http://devankuleindiren.com/Projects/rnn_arithmetic.php
|
|
"""
|
|
binary_format = "{:0" + str(dim) + "b}"
|
|
|
|
# Generate all possible number combinations
|
|
combs = list(islice(combinations(range(2 ** (dim - 1)), 2), n_samples))
|
|
|
|
# Initialize empty arrays
|
|
X = np.zeros((len(combs), dim, 2), dtype=np.uint8)
|
|
y = np.zeros((len(combs), dim, 1), dtype=np.uint8)
|
|
|
|
for i, (a, b) in enumerate(combs):
|
|
# Convert numbers to binary format
|
|
X[i, :, 0] = list(reversed([int(x) for x in binary_format.format(a)]))
|
|
X[i, :, 1] = list(reversed([int(x) for x in binary_format.format(b)]))
|
|
|
|
# Generate target variable (a+b)
|
|
y[i, :, 0] = list(reversed([int(x) for x in binary_format.format(a + b)]))
|
|
|
|
X_train, X_test, y_train, y_test = train_test_split(
|
|
X, y, test_size=0.2, random_state=1111
|
|
)
|
|
|
|
# Round number of examples for batch processing
|
|
train_b = (X_train.shape[0] // batch_size) * batch_size
|
|
test_b = (X_test.shape[0] // batch_size) * batch_size
|
|
X_train = X_train[0:train_b]
|
|
y_train = y_train[0:train_b]
|
|
|
|
X_test = X_test[0:test_b]
|
|
y_test = y_test[0:test_b]
|
|
return X_train, X_test, y_train, y_test
|
|
|
|
|
|
def addition_problem(ReccurentLayer):
|
|
X_train, X_test, y_train, y_test = addition_dataset(8, 5000)
|
|
|
|
print(X_train.shape, X_test.shape)
|
|
model = NeuralNet(
|
|
layers=[ReccurentLayer, TimeDistributedDense(1), Activation("sigmoid")],
|
|
loss="mse",
|
|
optimizer=Adam(),
|
|
metric="mse",
|
|
batch_size=64,
|
|
max_epochs=15,
|
|
)
|
|
model.fit(X_train, y_train)
|
|
predictions = np.round(model.predict(X_test))
|
|
predictions = np.packbits(predictions.astype(np.uint8))
|
|
y_test = np.packbits(y_test.astype(np.int))
|
|
print(accuracy(y_test, predictions))
|
|
|
|
|
|
# RNN
|
|
# addition_problem(RNN(16, parameters=Parameters(constraints={'W': SmallNorm(), 'U': SmallNorm()})))
|
|
# LSTM
|
|
addition_problem(LSTM(16))
|