| | import os |
| | import numpy as np |
| | import tensorflow as tf |
| | from tensorflow.keras.models import Sequential |
| | from tensorflow.keras.layers import Dense, Flatten |
| | from tensorflow.keras.utils import to_categorical |
| |
|
| | |
| | CHAR_SET = '0123456789+-=* /' |
| | NUM_CLASSES = len(CHAR_SET) |
| | MAX_EQUATION_LENGTH = 2000000 |
| | MAX_RESULT_LENGTH = 100000 |
| |
|
| | def one_hot_encode(s, max_length): |
| | encoding = np.zeros((max_length, NUM_CLASSES)) |
| | for i, char in enumerate(s[:max_length]): |
| | if char in CHAR_SET: |
| | char_index = CHAR_SET.index(char) |
| | encoding[i, char_index] = 1 |
| | return encoding |
| |
|
| | def read_dataset(directory): |
| | data = [] |
| | labels = [] |
| | |
| | for filename in os.listdir(directory): |
| | if filename.endswith('.txt'): |
| | with open(os.path.join(directory, filename), 'r') as file: |
| | for line in file: |
| | line = line.strip() |
| | if '=' in line: |
| | equation, result = line.split('=') |
| | equation = equation.strip() |
| | result = result.strip() |
| | data.append(one_hot_encode(equation, MAX_EQUATION_LENGTH)) |
| | labels.append(one_hot_encode(result, MAX_RESULT_LENGTH)) |
| | |
| | return np.array(data), np.array(labels) |
| |
|
| | |
| | data, labels = read_dataset('.math_train') |
| |
|
| | |
| | labels = labels.reshape((labels.shape[0], -1, NUM_CLASSES)) |
| |
|
| | |
| | model = Sequential([ |
| | Flatten(input_shape=(MAX_EQUATION_LENGTH, NUM_CLASSES)), |
| | Dense(128, activation='relu'), |
| | Dense(64, activation='relu'), |
| | Dense(MAX_RESULT_LENGTH * NUM_CLASSES, activation='softmax') |
| | ]) |
| |
|
| | model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) |
| |
|
| | |
| | model.fit(data, labels.reshape((-1, MAX_RESULT_LENGTH * NUM_CLASSES)), epochs=50, batch_size=32) |
| |
|
| | |
| | def solve_equation(model, equation): |
| | encoded_equation = one_hot_encode(equation, MAX_EQUATION_LENGTH) |
| | input_tensor = np.expand_dims(encoded_equation, axis=0) |
| | prediction = model.predict(input_tensor) |
| | predicted_indices = np.argmax(prediction.reshape((MAX_RESULT_LENGTH, NUM_CLASSES)), axis=-1) |
| | predicted_chars = ''.join(CHAR_SET[i] for i in predicted_indices if i < len(CHAR_SET)) |
| | return predicted_chars.strip() |
| |
|
| |
|
| | equation = "1 + 1" |
| | result = solve_equation(model, equation) |
| | print(f"The result of '{equation}' is '{result}'") |