{"cells":[{"metadata":{},"cell_type":"markdown","source":"Hi, all.\n\nI've tested PlaidML in my MacOSX.\n\nIt works well.\n\nI had a Radeon RX580 AMD GPU(8GB RAM) in my mac.\n\nIt use Keras. Image classification training using fine-tuning. \n\nIt's training peed is very faster than CPU mode.\n\n(It can choose from densenet121, densenet169, densenet201, inception_resnet_v2, inception_v3, mobilenet, mobilenet_v2, nasnet_large, nasnet_mobile, resnet50, vgg16, vgg19, xception, imdb_lstm)\n\nInstall & Test method is :\n\n1. pip3 install virtualenv\n2. virtualenv plaidml\n3. source plaidml/bin/activate\n4. pip3 install plaidml-keras plaidbench\n5. plaidml-setup   # no experimental\n6. plaidbench keras vgg19"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import math, json, os, sys\nos.environ[\"KERAS_BACKEND\"] = \"plaidml.keras.backend\"\n\nimport keras\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom keras.layers import Dense\nfrom keras.models import Model\nfrom keras.optimizers import Adam\nfrom keras.preprocessing import image","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","collapsed":true,"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":false},"cell_type":"code","source":"DATA_DIR = 'data'\nTRAIN_DIR = os.path.join(DATA_DIR, 'train')\nVALID_DIR = os.path.join(DATA_DIR, 'valid')\nSIZE = (224, 224)\nBATCH_SIZE = 4","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"if __name__ == \"__main__\":\n    num_train_samples = sum([len(files) for r, d, files in os.walk(TRAIN_DIR)])\n    num_valid_samples = sum([len(files) for r, d, files in os.walk(VALID_DIR)])\n\n    num_train_steps = math.floor(num_train_samples/BATCH_SIZE)\n    num_valid_steps = math.floor(num_valid_samples/BATCH_SIZE)\n\n    gen = keras.preprocessing.image.ImageDataGenerator()\n    val_gen = keras.preprocessing.image.ImageDataGenerator(horizontal_flip=True, vertical_flip=True)\n\n    batches = gen.flow_from_directory(TRAIN_DIR, target_size=SIZE, class_mode='categorical', shuffle=True, batch_size=BATCH_SIZE)\n    val_batches = val_gen.flow_from_directory(VALID_DIR, target_size=SIZE, class_mode='categorical', shuffle=True, batch_size=BATCH_SIZE)\n\n    model = keras.applications.vgg19.VGG19()\n\n    classes = list(iter(batches.class_indices))\n    model.layers.pop()\n    for layer in model.layers:\n        layer.trainable=False\n    last = model.layers[-1].output\n    x = Dense(len(classes), activation=\"softmax\")(last)\n    finetuned_model = Model(model.input, x)\n    finetuned_model.compile(optimizer=Adam(lr=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])\n    for c in batches.class_indices:\n        classes[batches.class_indices[c]] = c\n    finetuned_model.classes = classes\n\n    early_stopping = EarlyStopping(patience=10)\n    checkpointer = ModelCheckpoint('resnet50_best.h5', verbose=1, save_best_only=True)\n\n    finetuned_model.fit_generator(batches, steps_per_epoch=num_train_steps, epochs=1000, callbacks=[early_stopping, checkpointer], validation_data=val_batches, validation_steps=num_valid_steps)\n    finetuned_model.save('resnet50_final.h5')\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}