Slide 1

Slide 1 text

iOS ΤϯδχΞͷͨΊͷɺ Swi$ ͔Β Python ͷϥΠϒϥϦΛ ࢖ͬͯػցֶश͢Δํ๏ Yuta Koshizawa @koher

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

! ػցֶशೖ໳

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

! ෼ྨʢ Classifica)on ʣ

Slide 6

Slide 6 text

ྫ: ݂ӷݕࠪʹΑΔഏ͕Μͷ਍அ

Slide 7

Slide 7 text

ྫ: ݂ӷݕࠪʹΑΔഏ͕Μͷ਍அ ݈߁ͳਓͷσʔλ ඃݕऀ ID CYFRA (ng/ml) CEA (ng/ml) 0001 3.0 4.0 0002 2.8 4.5 0003 3.1 3.7 ... ... ...

Slide 8

Slide 8 text

ྫ: ݂ӷݕࠪʹΑΔഏ͕Μͷ਍அ ഏ͕Μͷਓͷσʔλ ඃݕऀ ID CYFRA (ng/ml) CEA (ng/ml) 1001 4.0 6.0 1002 3.4 7.0 1003 4.9 4.8 ... ... ...

Slide 9

Slide 9 text

ID: 0001, CYFRA: 3.0 ng/ml, CEA: 4.0 ng/ml

Slide 10

Slide 10 text

ID: 0002, CYFRA: 2.8 ng/ml, CEA: 4.5 ng/ml

Slide 11

Slide 11 text

ID: 0003, CYFRA: 3.1 ng/ml, CEA: 3.7 ng/ml

Slide 12

Slide 12 text

ɾɾɾ

Slide 13

Slide 13 text

ID: 1001, CYFRA: 4.0 ng/ml, CEA: 6.0 ng/ml

Slide 14

Slide 14 text

ID: 1002, CYFRA: 3.4 ng/ml, CEA: 7.0 ng/ml

Slide 15

Slide 15 text

ID: 1003, CYFRA: 4.9 ng/ml, CEA: 4.8 ng/ml

Slide 16

Slide 16 text

ɾɾɾ

Slide 17

Slide 17 text

ઢͷԼ → ݈߁ɺઢͷ্ → ഏ͕Μ

Slide 18

Slide 18 text

CYFRA: 3.2 ng/ml, CEA: 3.8 ng/ml

Slide 19

Slide 19 text

CYFRA: 4.5 ng/ml, CEA: 5.9 ng/ml

Slide 20

Slide 20 text

ػցֶश ! → ྑͦ͞͏ͳ௚ઢΛܾΊΔ

Slide 21

Slide 21 text

y = a x + b

Slide 22

Slide 22 text

y = a x + b

Slide 23

Slide 23 text

y = a x + b

Slide 24

Slide 24 text

y = -1.78 x + 11.1

Slide 25

Slide 25 text

௚ઢͰ෼ྨ

Slide 26

Slide 26 text

௚ઢͰ෼ྨ

Slide 27

Slide 27 text

͜Μͳσʔλͩͱʁ

Slide 28

Slide 28 text

௚ઢͰ෼ྨ͢Δͷ͸ແཧ͋Γ

Slide 29

Slide 29 text

͜ΜͳۂઢͰ෼ྨ͍ͨ͠

Slide 30

Slide 30 text

௚ઢͷࣜͰ͸ແཧ

Slide 31

Slide 31 text

ΑΓෳࡶͳ͕ࣜඞཁ

Slide 32

Slide 32 text

ෳࡶͳํ͕දݱྗ͕ߴͯ͘ྑ͍ʁ

Slide 33

Slide 33 text

͞ΒʹෳࡶͳࣜʹΑΔۂઢ

Slide 34

Slide 34 text

CYFRA: 3.2 ng/ml, CEA: 4.7 ng/ml

Slide 35

Slide 35 text

CYFRA: 3.2 ng/ml, CEA: 4.7 ng/ml

Slide 36

Slide 36 text

! ෳࡶͳϞσϧͳΒྑ͍ͱ͍͏Θ͚Ͱ͸ͳ͍

Slide 37

Slide 37 text

! ൚Խʢ Generaliza*on ʣ

Slide 38

Slide 38 text

ͲͷΑ͏ʹ൚ԽೳྗΛධՁ͢Ε͹Α͍ʁ

Slide 39

Slide 39 text

! ! ܇࿅σʔλʢ Training data ʣ ! ςετσʔλʢ Test data ʣ ʹ෼͚ͯ൚ԽೳྗΛධՁ͢Δɻ

Slide 40

Slide 40 text

શσʔλ

Slide 41

Slide 41 text

܇࿅σʔλ

Slide 42

Slide 42 text

܇࿅σʔλΛ࢖ֶͬͯश

Slide 43

Slide 43 text

܇࿅σʔλ: ਫ਼౓ 100%

Slide 44

Slide 44 text

ςετσʔλΛ࢖ͬͯධՁ

Slide 45

Slide 45 text

ςετσʔλ: ਫ਼౓ 90.0%

Slide 46

Slide 46 text

܇࿅σʔλΛ࢖ֶͬͯश

Slide 47

Slide 47 text

܇࿅σʔλ: ਫ਼౓ 97.1%

Slide 48

Slide 48 text

ςετσʔλΛ࢖ͬͯධՁ

Slide 49

Slide 49 text

ςετσʔλ: ਫ਼౓ 95.8%

Slide 50

Slide 50 text

܇࿅σʔλΛ࢖ֶͬͯश

Slide 51

Slide 51 text

܇࿅σʔλ: ਫ਼౓ 89.6%

Slide 52

Slide 52 text

ςετσʔλΛ࢖ͬͯධՁ

Slide 53

Slide 53 text

ςετσʔλ: ਫ਼౓ 85.8%

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

܇࿅σʔλΛ 10 ഒʹ૿΍ͯ͠ΈΔ

Slide 57

Slide 57 text

Overfi&ng ͷͱ͖ʢ܇࿅σʔλʣ

Slide 58

Slide 58 text

Overfi&ng ͷͱ͖ʢ܇࿅σʔλʣ

Slide 59

Slide 59 text

Overfi&ng ͷͱ͖ʢςετσʔλ: 90.0%ʣ

Slide 60

Slide 60 text

Overfi&ng ͷͱ͖ʢςετσʔλ: 95.0%ʣ

Slide 61

Slide 61 text

Underfi'ng ͷͱ͖ʢ܇࿅σʔλʣ

Slide 62

Slide 62 text

Underfi'ng ͷͱ͖ʢ܇࿅σʔλʣ

Slide 63

Slide 63 text

Underfi'ng ͷͱ͖ʢςετσʔλ: 85.8%ʣ

Slide 64

Slide 64 text

Underfi'ng ͷͱ͖ʢςετσʔλ: 85.8%ʣ

Slide 65

Slide 65 text

! ! ద߹ෆ଍ʢ Underfi(ng ʣ ! ա৒ద߹ʢ Overfi'ng ʣ Λ۠ผͯ͠ରԠํ๏Λߟ͑Δ

Slide 66

Slide 66 text

ಛ௃ྔ͕ 3 ݸ͋Δ৔߹ ඃݕऀ ID CYFRA (ng/ml) CEA (ng/ml) SCC (ng/ml) 0001 3.0 4.0 1.1 0002 2.8 4.5 1.4 0003 3.1 3.7 0.9 ... ... ... ...

Slide 67

Slide 67 text

ಛ௃ྔ͕ 3 ݸ͋Δ৔߹

Slide 68

Slide 68 text

ಛ௃ྔ͕ 3 ݸ͋Δ৔߹

Slide 69

Slide 69 text

! 4 ࣍ݩɾߴ࣍ݩۭؒΛ Πϝʔδ͢Δํ๏

Slide 70

Slide 70 text

࣍ݩ

Slide 71

Slide 71 text

෼ྨͷͨΊʹ͸ۭؒΛ෼ׂ͢Δ

Slide 72

Slide 72 text

࣍ݩͱஅ໘

Slide 73

Slide 73 text

࣍ݩͱஅ໘

Slide 74

Slide 74 text

࣍ݩͱஅ໘

Slide 75

Slide 75 text

࣍ݩͱஅ໘

Slide 76

Slide 76 text

! ௒ۂ໘ʢ Hypersurface ʣ

Slide 77

Slide 77 text

ۂ͕ͬͯͳ͍ͱ͖͸ ! ௒ฏ໘ʢ Hyperplane ʣ

Slide 78

Slide 78 text

! ๏ଇੑΛݟ͚ͭग़͢ N ࣍ݩۭؒ͸ N - 1 ࣍ݩۭؒͰ෼ׂͰ͖Δ

Slide 79

Slide 79 text

ۭؒʢ 3 ࣍ݩʣ + ࣌ؒʢ 1 ࣍ݩʣ = 4 ࣍ݩʁ

Slide 80

Slide 80 text

4 ࣍ݩۭ࣌ؒͷஅ໘

Slide 81

Slide 81 text

ݱࡏ͸ 4 ࣍ݩۭ࣌ؒΛ աڈͱະདྷʹ෼͚Δ௒ฏ໘

Slide 82

Slide 82 text

! 4 ࣍ݩ͸ۭ࣌ؒͰߟ͑Δͱ૝૾͠΍͍͢

Slide 83

Slide 83 text

2 ࣍ݩۭؒΛۂઢͰ෼͚Δ͜ͱΛߟ͑Δ

Slide 84

Slide 84 text

10 × 10 ͷ֨ࢠঢ়ͷσʔλ

Slide 85

Slide 85 text

10 × 10 ͷ֨ࢠঢ়ͷσʔλ

Slide 86

Slide 86 text

֨ࢠঢ়ͷσʔλͱ࣍ݩ • 2 ࣍ݩͩͱ ݅ • 3 ࣍ݩͩͱ ݅ • 4 ࣍ݩͩͱ ݅ • ... • 80 ࣍ݩͩͱ ݅

Slide 87

Slide 87 text

֨ࢠঢ়ͷσʔλͱ࣍ݩ • 2 ࣍ݩͩͱ ݅ • 3 ࣍ݩͩͱ ݅ • 4 ࣍ݩͩͱ ݅ • ... • 80 ࣍ݩͩͱ ݅ ← ؍ଌՄೳͳӉ஦ʹ͋Δݪࢠͷ਺

Slide 88

Slide 88 text

! ߴ࣍ݩۭؒ͸ലେ ୯७ʹσʔλ݅਺Λ૿΍͢ํ๏Ͱ௅Ήͷ͸ແ๳

Slide 89

Slide 89 text

खॻ͖਺ࣈͷ෼ྨ 1 1 h$p:/ /scikit-learn.org/stable/datasets/index.html#op;cal-recogni;on-of-handwri$en-digits-data-set

Slide 90

Slide 90 text

8 × 8 = 64 ըૉ

Slide 91

Slide 91 text

ೖྗ͸ 64 ࣍ݩͷσʔλ

Slide 92

Slide 92 text

ߴ࣍ݩۭؒͰͷ෼ྨͷΠϝʔδ

Slide 93

Slide 93 text

ߴ࣍ݩۭؒͰͷ෼ྨͷΠϝʔδ

Slide 94

Slide 94 text

ߴ࣍ݩۭؒͰͷ෼ྨͷΠϝʔδ

Slide 95

Slide 95 text

ߴ࣍ݩۭؒͰͷ෼ྨͷΠϝʔδ

Slide 96

Slide 96 text

ߴ࣍ݩۭؒͰͷ෼ྨͷΠϝʔδ

Slide 97

Slide 97 text

! ߴ࣍ݩͰ͸ઢܗϞσϧ΋༗༻

Slide 98

Slide 98 text

खॻ͖਺ࣈͷ෼ྨʢ Python ʣ # scikit-learn ͷؔ਺΍ΫϥεΛ import from sklearn.datasets import load_digits from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split # ֶश classifier = LinearSVC() dataset = load_digits() X_train, X_test, y_train, y_test = \ train_test_split(dataset["data"], dataset["target"]) classifier.fit(X_train, y_train) # ධՁ print(f"train: {classifier.score(X_train, y_train)}") print(f"test: {classifier.score(X_test, y_test)}")

Slide 99

Slide 99 text

खॻ͖਺ࣈͷ෼ྨʢ Python ʣ # scikit-learn ͷؔ਺΍ΫϥεΛ import from sklearn.datasets import load_digits from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split # ֶश classifier = LinearSVC() dataset = load_digits() X_train, X_test, y_train, y_test = \ train_test_split(dataset["data"], dataset["target"]) classifier.fit(X_train, y_train) # ධՁ print(f"train: {classifier.score(X_train, y_train)}") print(f"test: {classifier.score(X_test, y_test)}")

Slide 100

Slide 100 text

खॻ͖਺ࣈͷ෼ྨʢ Python ʣ # scikit-learn ͷؔ਺΍ΫϥεΛ import from sklearn.datasets import load_digits from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split # ֶश classifier = LinearSVC() dataset = load_digits() X_train, X_test, y_train, y_test = \ train_test_split(dataset["data"], dataset["target"]) classifier.fit(X_train, y_train) # ධՁ print(f"train: {classifier.score(X_train, y_train)}") print(f"test: {classifier.score(X_test, y_test)}")

Slide 101

Slide 101 text

खॻ͖਺ࣈͷ෼ྨʢ Python ʣ # scikit-learn ͷؔ਺΍ΫϥεΛ import from sklearn.datasets import load_digits from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split # ֶश classifier = LinearSVC() dataset = load_digits() X_train, X_test, y_train, y_test = \ train_test_split(dataset["data"], dataset["target"]) classifier.fit(X_train, y_train) # ධՁ print(f"train: {classifier.score(X_train, y_train)}") print(f"test: {classifier.score(X_test, y_test)}")

Slide 102

Slide 102 text

खॻ͖਺ࣈͷ෼ྨʢ Python ʣ # scikit-learn ͷؔ਺΍ΫϥεΛ import from sklearn.datasets import load_digits from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split # ֶश classifier = LinearSVC() dataset = load_digits() X_train, X_test, y_train, y_test = \ train_test_split(dataset["data"], dataset["target"]) classifier.fit(X_train, y_train) # ධՁ print(f"train: {classifier.score(X_train, y_train)}") print(f"test: {classifier.score(X_test, y_test)}")

Slide 103

Slide 103 text

खॻ͖਺ࣈͷ෼ྨʢ Python ʣ # scikit-learn ͷؔ਺΍ΫϥεΛ import from sklearn.datasets import load_digits from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split # ֶश classifier = LinearSVC() dataset = load_digits() X_train, X_test, y_train, y_test = \ train_test_split(dataset["data"], dataset["target"]) classifier.fit(X_train, y_train) # ධՁ print(f"train: {classifier.score(X_train, y_train)}") print(f"test: {classifier.score(X_test, y_test)}")

Slide 104

Slide 104 text

खॻ͖਺ࣈͷ෼ྨʢ݁Ռʣ train: 0.9925760950259837 test: 0.9666666666666667

Slide 105

Slide 105 text

! Swi% ͔Βಈతܕ෇ݴޠʹ ࿈ܞ͢Δͷʹ͔ܽͤͳ͍৽ػೳ

Slide 106

Slide 106 text

SE-0195: @dynamicMemberLookup 2 2 h$ps:/ /github.com/apple/swi6-evolu9on/blob/master/proposals/0195-dynamic-member-lookup.md

Slide 107

Slide 107 text

SE-0216: @dynamicCallable 3 3 h$ps:/ /github.com/apple/swi6-evolu9on/blob/master/proposals/0216-dynamic-callable.md

Slide 108

Slide 108 text

੩తܕ෇ݴޠͱͷ࿈ܞ import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } }

Slide 109

Slide 109 text

੩తܕ෇ݴޠͱͷ࿈ܞ import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoab() // ίϯύΠϧΤϥʔ // ^ } }

Slide 110

Slide 110 text

ಈతܕ෇ݴޠͱͷ࿈ܞ import NumPy let a = array([[1, 2], [3, 4]]) print(a.shape)

Slide 111

Slide 111 text

ಈతܕ෇ݴޠͱͷ࿈ܞ import NumPy let a = array([[1, 2], [3, 4]]) print(a.shabe) // ͜Ε͕ΤϥʔʹͳΔ͔࣮ߦ࣌·ͰΘ͔Βͳ͍ // ^

Slide 112

Slide 112 text

ಈతܕ෇ݴޠͱͷ࿈ܞ import NumPy let a = array([[1, 2], [3, 4]]) print(a["shape"]) // ͜Μͳײ͕͡ Swift ʹೃછΈͦ͏

Slide 113

Slide 113 text

ಈతܕ෇ݴޠͱͷ࿈ܞ import NumPy let a = array([[1, 2], [3, 4]]) print(a.shape) // Ͱ΋͜͏ॻ͚ͳ͍ͱਏ͍

Slide 114

Slide 114 text

SE-0195: @dynamicMemberLookup _ = foo.bar foo.bar = x // @dynamicMemberLookup Ͱ↑͕↓ͷγϯλοΫεγϡΨʔʹͳΔ _ = foo[dynamicMember: "bar"] foo[dynamicMember: "bar"] = x

Slide 115

Slide 115 text

SE-0195: @dynamicMemberLookup @dynamicMemberLookup struct Foo { subscript(dynamicMember member: String) -> Foo { ... } }

Slide 116

Slide 116 text

SE-0216: @dynamicCallable foo(42, "XYZ") foo(a: 42, b: "XYZ") // @dynamicCallable Ͱ↑͕↓ͷγϯλοΫεγϡΨʔʹͳΔ foo.dynamicallyCall(withArguments: [42, "XYZ"]) foo.dynamicallyCall(withKeywordArguments: ["a": 42, "b": "XYZ"])

Slide 117

Slide 117 text

SE-0216: @dynamicCallable @dynamicCallable struct Foo { ... @discardableResult func dynamicallyCall(withArguments: [FooConvertible]) -> Foo { ... } @discardableResult func dynamicallyCall(withKeywordArguments: [String: FooConvertible]) -> Foo { ... } }

Slide 118

Slide 118 text

Swi$ for TensorFlow 4 4 h$ps:/ /medium.com/tensorflow/introducing-swi8-for-tensorflow-b75722c58df0

Slide 119

Slide 119 text

! Swi% ͔Β Python ͷ ϥΠϒϥϦΛ࢖͏ํ๏

Slide 120

Slide 120 text

Python import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape)

Slide 121

Slide 121 text

Swi$ import Python let np = Python.import("numpy") let a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape)

Slide 122

Slide 122 text

No content

Slide 123

Slide 123 text

Swi$ import Python let np = Python.import("numpy") let a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape)

Slide 124

Slide 124 text

Swi$ import Python let np: PythonObject = Python.import("numpy") let a: PythonObject = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape)

Slide 125

Slide 125 text

PythonObject 5 @dynamicCallable @dynamicMemberLookup public struct PythonObject { ... } 5 h$ps:/ /github.com/apple/swi6/blob/tensorflow/stdlib/public/Python/Python.swi6

Slide 126

Slide 126 text

PythonObject 5 public extension PythonObject { subscript(dynamicMember memberName: String) -> PythonObject { get { guard let member = checking[dynamicMember: memberName] else { fatalError("Could not access PythonObject member '\(memberName)'") } return member } nonmutating set { let selfObject = ownedPyObject defer { Py_DecRef(selfObject) } let valueObject = newValue.ownedPyObject defer { Py_DecRef(valueObject) } if PyObject_SetAttrString(selfObject, memberName, valueObject) == -1 { try! throwPythonErrorIfPresent() fatalError(...) } } } ... } 5 h$ps:/ /github.com/apple/swi6/blob/tensorflow/stdlib/public/Python/Python.swi6

Slide 127

Slide 127 text

PythonObject 5 public extension PythonObject { subscript(dynamicMember memberName: String) -> PythonObject { get { guard let member = checking[dynamicMember: memberName] else { fatalError("Could not access PythonObject member '\(memberName)'") } return member } nonmutating set { let selfObject = ownedPyObject defer { Py_DecRef(selfObject) } let valueObject = newValue.ownedPyObject defer { Py_DecRef(valueObject) } if PyObject_SetAttrString(selfObject, memberName, valueObject) == -1 { try! throwPythonErrorIfPresent() fatalError(...) } } } ... } 5 h$ps:/ /github.com/apple/swi6/blob/tensorflow/stdlib/public/Python/Python.swi6

Slide 128

Slide 128 text

! Swi% ͔Β Python ͷ ϥΠϒϥϦΛ࢖ͬͯػցֶश

Slide 129

Slide 129 text

खॻ͖਺ࣈͷ෼ྨʢ Python ʣ # Python # scikit-learn ͷؔ਺΍ΫϥεΛ import from sklearn.datasets import load_digits from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split # ֶश classifier = LinearSVC() dataset = load_digits() X_train, X_test, y_train, y_test = \ train_test_split(dataset["data"], dataset["target"]) classifier.fit(X_train, y_train) # ධՁ print(f"train: {classifier.score(X_train, y_train)}") print(f"test: {classifier.score(X_test, y_test)}")

Slide 130

Slide 130 text

खॻ͖਺ࣈͷ෼ྨʢ Swi% ʣ import Python // scikit-learn ͷؔ਺΍ΫϥεΛ import let load_digits = Python.import("sklearn.datasets").load_digits let LinearSVC = Python.import("sklearn.svm").LinearSVC let train_test_split = Python.import("sklearn.model_selection").train_test_split // ֶश let classifier = LinearSVC() let dataset = load_digits() let (X_train, X_test, y_train, y_test) = train_test_split(dataset["data"], dataset["target"]).tuple4 classifier.fit(X_train, y_train) // ධՁ print("train: \(classifier.score(X_train, y_train))") print("test: \(classifier.score(X_test, y_test))")

Slide 131

Slide 131 text

࣮ߦͷ༷ࢠ

Slide 132

Slide 132 text

! ϞσϧΛ Core ML ༻ʹ ม׵ͯ͠ iOS ΞϓϦͰ࢖͏

Slide 133

Slide 133 text

coremltools 6 6 h$ps:/ /github.com/apple/coremltools

Slide 134

Slide 134 text

Core ML ༻ͷϞσϧΛ࡞੒ // coremltools ͷ import let coremltools = Python.import("coremltools") // Ϟσϧͷม׵ͱอଘ let coreml_model = coremltools.converters.sklearn .convert(classifier) coreml_model.save("Digits.mlmodel")

Slide 135

Slide 135 text

coremltools Λ import // coremltools ͷ import let coremltools = Python.import("coremltools") // Ϟσϧͷม׵ͱอଘ let coreml_model = coremltools.converters.sklearn .convert(classifier) coreml_model.save("Digits.mlmodel")

Slide 136

Slide 136 text

ϞσϧΛม׵ // coremltools ͷ import let coremltools = Python.import("coremltools") // Ϟσϧͷม׵ͱอଘ let coreml_model = coremltools.converters.sklearn .convert(classifier) coreml_model.save("Digits.mlmodel")

Slide 137

Slide 137 text

ϞσϧΛอଘ // coremltools ͷ import let coremltools = Python.import("coremltools") // Ϟσϧͷม׵ͱอଘ let coreml_model = coremltools.converters.sklearn .convert(classifier) coreml_model.save("Digits.mlmodel")

Slide 138

Slide 138 text

No content

Slide 139

Slide 139 text

No content

Slide 140

Slide 140 text

iOS ΞϓϦ͔Βม׵ͨ͠ϞσϧΛར༻ class ViewController: UIViewController { @IBOutlet var canvasView: CanvasView! private let classifier = Digits() @IBAction func pressClassifyButton(_ button: UIButton) { let image = Image(uiImage: canvasView.image).resizedTo(width: 8, height: 8) let input = try! MLMultiArray(shape: [8, 8], dataType: .double) var pointer = input.dataPointer.bindMemory(to: Double.self, capacity: 8 * 8) for pixel in image { pointer.pointee = Double(255 - pixel) / 16.0 pointer += 1 } let result = try! classifier.prediction(input: DigitsInput(input: input)) let alertController = UIAlertController(title: "\(result.classLabel)", message: nil, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Dismiss", style: .default) { [weak self] _ in self?.canvasView.clear() }) present(alertController, animated: true, completion: nil) } }

Slide 141

Slide 141 text

෼ྨثͷੜ੒ class ViewController: UIViewController { @IBOutlet var canvasView: CanvasView! private let classifier = Digits() @IBAction func pressClassifyButton(_ button: UIButton) { let image = Image(uiImage: canvasView.image).resizedTo(width: 8, height: 8) let input = try! MLMultiArray(shape: [8, 8], dataType: .double) var pointer = input.dataPointer.bindMemory(to: Double.self, capacity: 8 * 8) for pixel in image { pointer.pointee = Double(255 - pixel) / 16.0 pointer += 1 } let result = try! classifier.prediction(input: DigitsInput(input: input)) let alertController = UIAlertController(title: "\(result.classLabel)", message: nil, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Dismiss", style: .default) { [weak self] _ in self?.canvasView.clear() }) present(alertController, animated: true, completion: nil) } }

Slide 142

Slide 142 text

No content

Slide 143

Slide 143 text

Digits.mlmodel ͔Β෼ྨثͷΫϥε͕ࣗಈੜ੒͞ΕΔ class Digits { var model: MLModel convenience init() { ... } func prediction(input: DigitsInput) throws -> DigitsOutput { let outFeatures = try model.prediction(from: input) let result = DigitsOutput( classLabel: outFeatures.featureValue(for: "classLabel")!.int64Value, classProbability: outFeatures.featureValue( for: "classProbability" )!.dictionaryValue as! [Int64 : Double] ) return result } ... }

Slide 144

Slide 144 text

Ϙλϯ͕ԡ͞Εͨͱ͖ class ViewController: UIViewController { @IBOutlet var canvasView: CanvasView! private let classifier = Digits() @IBAction func pressClassifyButton(_ button: UIButton) { let image = Image(uiImage: canvasView.image).resizedTo(width: 8, height: 8) let input = try! MLMultiArray(shape: [8, 8], dataType: .double) var pointer = input.dataPointer.bindMemory(to: Double.self, capacity: 8 * 8) for pixel in image { pointer.pointee = Double(255 - pixel) / 16.0 pointer += 1 } let result = try! classifier.prediction(input: DigitsInput(input: input)) let alertController = UIAlertController(title: "\(result.classLabel)", message: nil, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Dismiss", style: .default) { [weak self] _ in self?.canvasView.clear() }) present(alertController, animated: true, completion: nil) } }

Slide 145

Slide 145 text

෼ྨثʹ౉͢ೖྗ஋Λੜ੒ class ViewController: UIViewController { @IBOutlet var canvasView: CanvasView! private let classifier = Digits() @IBAction func pressClassifyButton(_ button: UIButton) { let image = Image(uiImage: canvasView.image).resizedTo(width: 8, height: 8) let input = try! MLMultiArray(shape: [8, 8], dataType: .double) var pointer = input.dataPointer.bindMemory(to: Double.self, capacity: 8 * 8) for pixel in image { pointer.pointee = Double(255 - pixel) / 16.0 pointer += 1 } let result = try! classifier.prediction(input: DigitsInput(input: input)) let alertController = UIAlertController(title: "\(result.classLabel)", message: nil, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Dismiss", style: .default) { [weak self] _ in self?.canvasView.clear() }) present(alertController, animated: true, completion: nil) } }

Slide 146

Slide 146 text

෼ྨ class ViewController: UIViewController { @IBOutlet var canvasView: CanvasView! private let classifier = Digits() @IBAction func pressClassifyButton(_ button: UIButton) { let image = Image(uiImage: canvasView.image).resizedTo(width: 8, height: 8) let input = try! MLMultiArray(shape: [8, 8], dataType: .double) var pointer = input.dataPointer.bindMemory(to: Double.self, capacity: 8 * 8) for pixel in image { pointer.pointee = Double(255 - pixel) / 16.0 pointer += 1 } let result = try! classifier.prediction(input: DigitsInput(input: input)) let alertController = UIAlertController(title: "\(result.classLabel)", message: nil, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Dismiss", style: .default) { [weak self] _ in self?.canvasView.clear() }) present(alertController, animated: true, completion: nil) } }

Slide 147

Slide 147 text

݁ՌΛ UIAlertController Ͱදࣔ class ViewController: UIViewController { @IBOutlet var canvasView: CanvasView! private let classifier = Digits() @IBAction func pressClassifyButton(_ button: UIButton) { let image = Image(uiImage: canvasView.image).resizedTo(width: 8, height: 8) let input = try! MLMultiArray(shape: [8, 8], dataType: .double) var pointer = input.dataPointer.bindMemory(to: Double.self, capacity: 8 * 8) for pixel in image { pointer.pointee = Double(255 - pixel) / 16.0 pointer += 1 } let result = try! classifier.prediction(input: DigitsInput(input: input)) let alertController = UIAlertController(title: "\(result.classLabel)", message: nil, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Dismiss", style: .default) { [weak self] _ in self?.canvasView.clear() }) present(alertController, animated: true, completion: nil) } }

Slide 148

Slide 148 text

Swi$Digits 7 7 h$ps:/ /github.com/koher/swi6-digits

Slide 149

Slide 149 text

࣮ࡍͷͱ͜Ζ - ϓϩμΫγϣϯ؀ڥͰ࢖͏ͷ͸·ͩා͍ - ֶश͸ਪ࿦ΑΓ΋ະख़ͳٕज़Λ࢖͍΍͍͢ - Python Λ஌Βͳͯ͘ྑ͍Θ͚Ͱ͸ͳ͍ - Swift Ͱ΋ॻ͚ΔॲཧΛ Swift Ͱॻ͚Δͷ͸͏Ε͍͠ - Swift ͷະདྷΛࠓ͔ΒମݧͰ͖Δ

Slide 150

Slide 150 text

! ࣗ෼ͰֶͿͱ͖ʹ໾ཱͭࢿྉ

Slide 151

Slide 151 text

Machine Learning | Coursera 8 8 h$ps:/ /www.coursera.org/learn/machine-learning

Slide 152

Slide 152 text

PythonͰ͸͡ΊΔػցֶश 9 9 h$ps:/ /www.oreilly.co.jp/books/9784873117980/

Slide 153

Slide 153 text

ѻΘͳ͔ͬͨτϐοΫ - ! ݕূσʔλʢ Validation data ʣ - ! લॲཧʢ Preprocessing ʣ - ! ਖ਼ଇԽʢ Regularization ʣ - ! ަࠩݕূʢ Cross-validation ʣ - ! ِཅੑʢ False Positive ʣɺِӄੑʢ False Negative ʣ - ! ద߹཰ʢ Precision ʣɺ࠶ݱ཰ʢ Recall ʣɺ ɹ F ஋ʢ F-measure ʣ - ...

Slide 154

Slide 154 text

No content

Slide 155

Slide 155 text

Ϟσϧͷબ୒ʹςετσʔλΛར༻ͯ͠ ਖ਼͘͠ධՁͰ͖͍ͯΔͷ͔ʁ

Slide 156

Slide 156 text

! ݕূσʔλʢ Valida'on data ʣ ͰϞσϧΛධՁͯ͠બ୒͠ɺ ςετσʔλͰ൚ԽೳྗΛධՁ͢Δ

Slide 157

Slide 157 text

SE-0195: @dynamicMemberLookup 2 2 h$ps:/ /github.com/apple/swi6-evolu9on/blob/master/proposals/0195-dynamic-member-lookup.md

Slide 158

Slide 158 text

SE-0216: @dynamicCallable 3 3 h$ps:/ /github.com/apple/swi6-evolu9on/blob/master/proposals/0216-dynamic-callable.md

Slide 159

Slide 159 text

Swi$ for TensorFlow 4 4 h$ps:/ /medium.com/tensorflow/introducing-swi8-for-tensorflow-b75722c58df0

Slide 160

Slide 160 text

Swi$ for TensorFlow ͷΠϯετʔϧ 10 10 h%ps:/ /github.com/tensorflow/swi8/blob/master/Installa

Slide 161

Slide 161 text

Xcode 10 beta Λ࢖͏৔߹ sudo xcode-select -s /Applications/Xcode-beta.app/

Slide 162

Slide 162 text

Core ML ༻ʹϞσϧΛม׵ 11 11 h$ps:/ /developer.apple.com/documenta6on/coreml/conver6ngtrainedmodelstocore_ml

Slide 163

Slide 163 text

coremltools 6 6 h$ps:/ /github.com/apple/coremltools

Slide 164

Slide 164 text

͓͠·͍