Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ML Ops Study 2

ML Ops Study 2

5月29日にクックパッド株式会社で開催されたML Ops Study #2の発表資料です。

ARIYAMA Keiji

May 29, 2018
Tweet

More Decks by ARIYAMA Keiji

Other Decks in Technology

Transcript

  1. C-LIS CO., LTD.   ༗ࢁܓೋʢ,FJKJ"3*:"."ʣ $-*4$0 -5% Photo :

    Koji MORIGUCHI (MORIGCHOWDER) "OESPJEΞϓϦ։ൃνϣοτσΩϧ ػցֶश͸ͪΐͬͱ΍ͬͨ͜ͱ͋Γ·͢
  2.   ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ

    ը૾औಘ ϥϕϧ ෇͚ σʔληοτ؅ཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ෇͚ Android
 ΞϓϦ
  3. ϥϕϧͷछྨ PSJHJOBM@BSU OTGX GBWPSJUF QIPUP JMMVTU DPNJD   GBDF

    GFNBMF NFHBOF TDISPPM@VOJGPSN CMB[FS@VOJGPSN TBJMPS@VOJGPSN HM LFNPOP NBMF CM DBU EPH GPPE EJTMJLF
  4. ֶश༻σʔλͷੜ੒ 5'3FDPSEܗࣜPS+1&( $47ܗࣜ ը૾ͷϦαΠζ͸͜ͷஈ֊Ͱߦ͏ʢτϥϑΟοΫΛ௿ݮ   $ python ./create_dataset.py \

    --base_dir /dataset/source/ \ --output_dir ~/tfrecords_classifier \ --image_size 256 \ --tag_names megane,nsfw,favorite,illust
  5. σʔλͷάϧʔϓԽ   0 1 2 3 4 5 6

    7 8 9 σʔληοτ ςετσʔληοτ
  6.   ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ

    ը૾औಘ ϥϕϧ ෇͚ σʔληοτ؅ཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ෇͚ Android
 ΞϓϦ
  7. ֶशͱݕূͷ࣮ߦ   $ CUDA_VISIBLE_DEVICES=0,1 python ./train.py \ --learning_config config_megane.json

    \ --tfrecords_dir ~/tfrecords_classifier \ --train_dir ~/train_single_discriminator \ --summary_dir ~/summary_single_discriminator \ --batch_size 64 \ --learning_rate 0.0001 \ --num_gpus 2 \ --max_step 100000 $ CUDA_VISIBLE_DEVICES=2 python ./eval.py \ --learning_config config_megane.json \ --tfrecords_dir ~/tfrecords_classifier \ --train_dir ~/train_single_discriminator \ --summary_dir ~/summary_single_discriminator $ tensorboard \ --logdir ~/summary_single_discriminator/megane/
  8.   ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ

    ը૾औಘ ϥϕϧ ෇͚ σʔληοτ؅ཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ෇͚ Android
 ΞϓϦ
  9. ධՁͷ࣮ߦ   $ python3 client.py \ --tag_name megane \

    --train_base_path ~/train_single_discriminator \ --train_file_name precision-0.956463/megane.ckpt-294000 \ --batch_size 16 \ --limit_batch 100
  10.   ධՁ༻ αʔόʔ ܇࿅ɾֶश༻αʔόʔ σʔληοτసૹ ʢTFRecordʣ ֶशࡁΈ ύϥϝʔλʔऔಘ ը૾औಘ

    ը૾औಘ ϥϕϧ ෇͚ σʔληοτ؅ཧ αʔόʔ σʔλऩूݩ αʔϏε ը૾औಘ ϥϕϧ ෇͚ Android
 ΞϓϦ
  11. ෆద੾ʢ/4'8ʣը૾ͱ؟ڸը૾ /4'8    positive: 36,083 → 7.17%
 negative:

    466,738 ؟ڸ    positive: 23,559 → 2.44%
 negative: 938,563  
  12. private val IMAGE_WIDTH = 128 private val IMAGE_HEIGHT = 128

    private val IMAGE_CHANNEL = 3 private val IMAGE_BYTES_LENGTH = IMAGE_WIDTH * IMAGE_HEIGHT * IMAGE_CHANNEL val imageByteBuffer: ByteBuffer = ByteBuffer.allocate(IMAGE_BYTES_LENGTH) val scaledBitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, false) scaledBitmap.copyPixelsToBuffer(imageByteBuffer)   ը૾ΛόοϑΝʹ֨ೲ
  13. val resultArray = FloatArray(1) fun recognize(imageByteArray: ByteArray): Float { val

    start = Debug.threadCpuTimeNanos() tfInference.feed("input", imageByteArray, imageByteArray.size.toLong()) tfInference.run(arrayOf("result")) tfInference.fetch("result", resultArray) val elapsed = Debug.threadCpuTimeNanos() - start Log.d(TAG, "Elapsed: %d ns".format(elapsed)) return resultArray[0] }   GFFESVOGFUDI
  14. private val IMAGE_WIDTH = 128 private val IMAGE_HEIGHT = 128

    private val IMAGE_CHANNEL = 3 private val IMAGE_BYTES_LENGTH = IMAGE_WIDTH * IMAGE_HEIGHT * IMAGE_CHANNEL val imageByteBuffer: ByteBuffer = ByteBuffer.allocate(IMAGE_BYTES_LENGTH) val scaledBitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, false) scaledBitmap.copyPixelsToBuffer(imageByteBuffer) scaledBitmap.recycle()   ݪҼΒ͖͠΋ͷ ˢ"MQIBνϟϯωϧ͕ೖ͍ͬͯΔ
  15. with tf.Graph().as_default() as g: image_ph = tf.placeholder( tf.uint8, [model.IMAGE_SIZE *

    model.IMAGE_SIZE * 4], name='input') image = tf.cast(image_ph, tf.float32) image = tf.reshape( image, [model.IMAGE_SIZE, model.IMAGE_SIZE, 4]) image = image[:, :, :3]   QCग़ྗ࣌ʹDIΛड͚ೖΕΔΑ͏ʹάϥϑΛมߋ
  16. ࠓޙͷ՝୊ 5FOTPS'MPX-JUF΁ͷҠߦ ߴਫ਼౓ͷϞσϧͷѹॖʢল༰ྔԽʣ 1SVOJOH 2VBOUJ[BUJPO %JTUJMMBUJPO   ML Kit:

    Machine Learning SDK for mobile developers (Google I/O '18) https://youtu.be/Z-dqGRSsaBs?t=32m10s