From 2b8e26b54bfec8a4ddbc2e765199ff1bb06463c9 Mon Sep 17 00:00:00 2001 From: Crista Lopes Date: Thu, 3 Dec 2020 10:19:24 -0800 Subject: [PATCH] Added this other version for bow-tie --- 37-bow-tie/tf-37-learning-categorical.py | 73 ++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 37-bow-tie/tf-37-learning-categorical.py diff --git a/37-bow-tie/tf-37-learning-categorical.py b/37-bow-tie/tf-37-learning-categorical.py new file mode 100644 index 0000000..456bc0c --- /dev/null +++ b/37-bow-tie/tf-37-learning-categorical.py @@ -0,0 +1,73 @@ +from keras.models import Sequential +from keras.layers import Dense, Activation, Multiply, ReLU, Lambda +import keras.backend as K +import numpy as np +import sys, os, string, random + +characters = string.printable +char_indices = dict((c, i) for i, c in enumerate(characters)) +indices_char = dict((i, c) for i, c in enumerate(characters)) + +INPUT_VOCAB_SIZE = len(characters) +BATCH_SIZE = 200 + +def encode_one_hot(line): + x = np.zeros((len(line), INPUT_VOCAB_SIZE)) + for i, c in enumerate(line): + index = char_indices[c] if c in characters else char_indices[' '] + x[i][index] = 1 + return x + +def decode_one_hot(x): + s = [] + for onehot in x: + one_index = np.argmax(onehot) + s.append(indices_char[one_index]) + return ''.join(s) + +def build_model(): + model = Sequential() + model.add(Dense(1, input_shape=(INPUT_VOCAB_SIZE,))) + model.add(Dense(INPUT_VOCAB_SIZE)) + model.add(Dense(INPUT_VOCAB_SIZE, activation='softmax')) + return model + +def input_generator(nsamples): + def generate_line(): + inline = []; outline = [] + for _ in range(nsamples): + c = random.choice(characters) + expected = c.lower() if c in string.ascii_letters else ' ' + inline.append(c); outline.append(expected) + return ''.join(inline), ''.join(outline) + + while True: + input_data, expected = generate_line() + data_in = encode_one_hot(input_data) + data_out = encode_one_hot(expected) + yield data_in, data_out + +def train(model): + model.compile(loss='categorical_crossentropy', + optimizer='adam', + metrics=['accuracy']) + input_gen = input_generator(BATCH_SIZE) + validation_gen = input_generator(BATCH_SIZE) + model.fit_generator(input_gen, + epochs = 10, workers=1, + steps_per_epoch = 1000, + validation_data = validation_gen, + validation_steps = 10) + +model = build_model() +model.summary() +train(model) + +input("Network has been trained. Press to run program.") +with open(sys.argv[1]) as f: + for line in f: + if line.isspace(): continue + batch = encode_one_hot(line) + preds = model.predict(batch) + normal = decode_one_hot(preds) + print(normal) \ No newline at end of file