Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
tutorials/kerasTUT/7-RNN_Classifier_example.py /
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
82 lines (63 sloc)
2.43 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| To know more or get code samples, please visit my website: | |
| https://mofanpy.com/tutorials/ | |
| Or search: 莫烦Python | |
| Thank you for supporting! | |
| """ | |
| # please note, all tutorial code are running under python3.5. | |
| # If you use the version like python2.7, please modify the code accordingly | |
| # 8 - RNN Classifier example | |
| # to try tensorflow, un-comment following two lines | |
| # import os | |
| # os.environ['KERAS_BACKEND']='tensorflow' | |
| import numpy as np | |
| np.random.seed(1337) # for reproducibility | |
| from keras.datasets import mnist | |
| from keras.utils import np_utils | |
| from keras.models import Sequential | |
| from keras.layers import SimpleRNN, Activation, Dense | |
| from keras.optimizers import Adam | |
| TIME_STEPS = 28 # same as the height of the image | |
| INPUT_SIZE = 28 # same as the width of the image | |
| BATCH_SIZE = 50 | |
| BATCH_INDEX = 0 | |
| OUTPUT_SIZE = 10 | |
| CELL_SIZE = 50 | |
| LR = 0.001 | |
| # download the mnist to the path '~/.keras/datasets/' if it is the first time to be called | |
| # X shape (60,000 28x28), y shape (10,000, ) | |
| (X_train, y_train), (X_test, y_test) = mnist.load_data() | |
| # data pre-processing | |
| X_train = X_train.reshape(-1, 28, 28) / 255. # normalize | |
| X_test = X_test.reshape(-1, 28, 28) / 255. # normalize | |
| y_train = np_utils.to_categorical(y_train, num_classes=10) | |
| y_test = np_utils.to_categorical(y_test, num_classes=10) | |
| # build RNN model | |
| model = Sequential() | |
| # RNN cell | |
| model.add(SimpleRNN( | |
| # for batch_input_shape, if using tensorflow as the backend, we have to put None for the batch_size. | |
| # Otherwise, model.evaluate() will get error. | |
| batch_input_shape=(None, TIME_STEPS, INPUT_SIZE), # Or: input_dim=INPUT_SIZE, input_length=TIME_STEPS, | |
| output_dim=CELL_SIZE, | |
| unroll=True, | |
| )) | |
| # output layer | |
| model.add(Dense(OUTPUT_SIZE)) | |
| model.add(Activation('softmax')) | |
| # optimizer | |
| adam = Adam(LR) | |
| model.compile(optimizer=adam, | |
| loss='categorical_crossentropy', | |
| metrics=['accuracy']) | |
| # training | |
| for step in range(4001): | |
| # data shape = (batch_num, steps, inputs/outputs) | |
| X_batch = X_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :, :] | |
| Y_batch = y_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :] | |
| cost = model.train_on_batch(X_batch, Y_batch) | |
| BATCH_INDEX += BATCH_SIZE | |
| BATCH_INDEX = 0 if BATCH_INDEX >= X_train.shape[0] else BATCH_INDEX | |
| if step % 500 == 0: | |
| cost, accuracy = model.evaluate(X_test, y_test, batch_size=y_test.shape[0], verbose=False) | |
| print('test cost: ', cost, 'test accuracy: ', accuracy) | |