Here
%pylab inline
import random
import string
import numpy as np
import tensorflow as tf
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import LSTM, TimeDistributed, Dense, SimpleRNN
BATCH_SIZE = 1
NAMESPACE = string.ascii_uppercase+string.digits
NAMESPACELENGTH = len(NAMESPACE)
def generate_encoding():
encoding = {}
for i, letter in enumerate(NAMESPACE):
encoding[letter] = i
return encoding
ENCODING = generate_encoding()
def letter_to_vec(letter):
vec = np.zeros(NAMESPACELENGTH)
vec[ENCODING[letter]] = 1
return vec
def word_to_matrix(word):
return np.array([letter_to_vec(letter) for letter in word])
def dummy_X_y(size=BATCH_SIZE):
X = []
y = []
for N in np.random.randint(1, 100, size):
tmp = ''.join(random.choice(NAMESPACE) for _ in range(N))
X.append(tmp)
y.append(len(tmp))
del tmp
return X, y
print(dummy_X_y())
def generate_model():
model = Sequential()
model.add(SimpleRNN(1, input_shape=(None, NAMESPACELENGTH), return_sequences=False))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error',
optimizer='adam', metrics=['mean_squared_error'])
return model
model = generate_model()
for _ in range(20000):
# train LSTM
# generate new random sequence
X,y = dummy_X_y(size=BATCH_SIZE)
X = np.array([word_to_matrix(x) for x in X])
# fit model for one epoch on this sequence
model.fit(X, y, epochs=1, batch_size=BATCH_SIZE, verbose=1)