【Swift】Keras로 만든 회귀 모델을 CoreML에서 사용할 때까지
소개
iOS의 기계 학습 프레임워크 CoreML에서는 Keras에서 훈련된 기계 학습 모델을 활용할 수 있습니다.
본 기사에서는 Keras에 의한 회귀 모델을 CoreML상에서 움직이도록 변환해, 실제로 예측을 할 때까지의 흐름에 대해 설명합니다.
거친 흐름으로서는 다음과 같이 됩니다.
이 기사의 실행 환경
1: 회귀 모델을 .h5 파일로 출력
htps //w w. 천식 rfぉw. 오 rg / 쓰리 야 ls / 케라 s / re g rishon
이번에는 위 튜토리얼을 기반으로 자동차의 연비를 예측하는 회귀 모델을 작성하여 .h5 파일로 출력합니다.
그러나 튜토리얼의 코드를 그대로 실행하여 만든 모델을 CoreML에서 사용할 수 있는 형식으로 변환하려고 하면 오류가 발생합니다. Keras를 Tensorflow를 통해 import하는 것과 관련된 것 같습니다.
따라서 Keras를 직접 import하는 형태로 재작성하여 실행합니다. 아래 코드를 참조하십시오.
from __future__ import absolute_import, division, print_function, unicode_literals
import pathlib
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
dataset_path = keras.utils.get_file("auto-mpg.data", "https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
'Acceleration', 'Model Year', 'Origin']
raw_dataset = pd.read_csv(dataset_path, names=column_names,
na_values = "?", comment='\t',
sep=" ", skipinitialspace=True)
dataset = raw_dataset.copy()
dataset = dataset.dropna()
origin = dataset.pop('Origin')
dataset['USA'] = (origin == 1)*1.0
dataset['Europe'] = (origin == 2)*1.0
dataset['Japan'] = (origin == 3)*1.0
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
train_stats = train_dataset.describe()
train_stats.pop("MPG")
train_stats = train_stats.transpose()
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
def build_model():
model = Sequential([
Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
Dense(64, activation='relu'),
Dense(1)
])
optimizer = optimizers.RMSprop(0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
return model
model = build_model()
class PrintDot(keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs):
if epoch % 100 == 0: print('')
print('.', end='')
EPOCHS = 1000
history = model.fit(
normed_train_data, train_labels,
epochs=EPOCHS, validation_split = 0.2, verbose=0,
callbacks=[PrintDot()])
# これでモデルを.h5ファイルに出力します。
model.save("SampleReg.h5")
2: .h5 파일을 .mlmodel 파일로 변환
방금 만든 .h5 파일을 CoreML로 처리할 수 있는 .mlmodel 파일로 변환합니다.
먼저 변환에 필요한 coremltools를 Python에 설치합니다.$ pip install -U coremltools
또한 Tensorflow 또는 Keras가 익숙한 Python 환경에 설치되어 있지 않은 경우 다시 설치하십시오.
설치가 완료되면 아래 코드를 실행하여 .h5 파일을 .mlmodel 파일로 변환할 수 있습니다.
import coremltools
coreml_model = coremltools.converters.keras.convert('SampleReg.h5')
coreml_model.save('SampleRegonCoreML.mlmodel')
3: CoreML에서 모델 사용
Xcode를 시작하고 iOS 프로젝트를 새로 만든 다음 파일 목록에 방금 만든 .mlmodel 파일을 추가합니다.
이 .mlmodel 파일을 클릭하면 아래 그림과 같이 모델 개요가 표시됩니다.
입력(Inputs)으로서 9개의 변수를 취해, 출력(Outputs)으로서 1개의 변수를 내는 모델인 것을 확인할 수 있습니다.
MultiArray라는 것은 MLMultiArray라고 하는 CoreML의 클래스를 가리키는 것 같고, 이것은 모델의 입출력을 취급하기 위한 다차원 배열의 클래스가 됩니다. 모양(Shape)이나 데이터형을 지정하여 배열을 만들 수 있습니다.
이제 이 모델을 사용하여 실제로 예측을 수행합니다. 아래 코드를 참조하십시오.
import CoreML
// .mlmodelファイルを追加した時点でモデルと同じ名前のクラスが自動的に生成され、
// さらにそれらの入力データ/出力データを扱うクラスも作られます(名前は「モデル名+Input/Output」)。
let model = SampleRegonCoreML()
// MLMultiArrayはこのように配列形状とデータ型を指定して初期化することができます。
// let inputArray = try! MLMultiArray(shape: [9], dataType: MLMultiArrayDataType.double)
// 一方で従来の配列から直接作ることもできます。今回は元のデータセットから抜き出した1データについて直打ちしてみました。
let inputArray = try! MLMultiArray([1.483887,1.578444,2.890853,1.925289,-0.559020,-1.604642,0.774676,-0.465148,-0.495225])
// 上の配列を用意したモデルの入力としてあてがいます。
let inputToModel: SampleRegonCoreMLInput = try! SampleRegonCoreMLInput(input1: inputArray)
// 予測を行い、その結果を出力します。
if let prediction = try? model.prediction(input: inputToModel) {
print(prediction.output1)
}
Keras측에서 같은 데이터에 대해 model.predict()한 결과와 상기 코드에 의해 출력되는 결과가 일치하는지 확인합니다.
Reference
이 문제에 관하여(【Swift】Keras로 만든 회귀 모델을 CoreML에서 사용할 때까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kirikabu_ueda/items/1060da8110fea7aab35e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from __future__ import absolute_import, division, print_function, unicode_literals
import pathlib
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
dataset_path = keras.utils.get_file("auto-mpg.data", "https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
'Acceleration', 'Model Year', 'Origin']
raw_dataset = pd.read_csv(dataset_path, names=column_names,
na_values = "?", comment='\t',
sep=" ", skipinitialspace=True)
dataset = raw_dataset.copy()
dataset = dataset.dropna()
origin = dataset.pop('Origin')
dataset['USA'] = (origin == 1)*1.0
dataset['Europe'] = (origin == 2)*1.0
dataset['Japan'] = (origin == 3)*1.0
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
train_stats = train_dataset.describe()
train_stats.pop("MPG")
train_stats = train_stats.transpose()
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
def build_model():
model = Sequential([
Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
Dense(64, activation='relu'),
Dense(1)
])
optimizer = optimizers.RMSprop(0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
return model
model = build_model()
class PrintDot(keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs):
if epoch % 100 == 0: print('')
print('.', end='')
EPOCHS = 1000
history = model.fit(
normed_train_data, train_labels,
epochs=EPOCHS, validation_split = 0.2, verbose=0,
callbacks=[PrintDot()])
# これでモデルを.h5ファイルに出力します。
model.save("SampleReg.h5")
방금 만든 .h5 파일을 CoreML로 처리할 수 있는 .mlmodel 파일로 변환합니다.
먼저 변환에 필요한 coremltools를 Python에 설치합니다.
$ pip install -U coremltools
또한 Tensorflow 또는 Keras가 익숙한 Python 환경에 설치되어 있지 않은 경우 다시 설치하십시오.설치가 완료되면 아래 코드를 실행하여 .h5 파일을 .mlmodel 파일로 변환할 수 있습니다.
import coremltools
coreml_model = coremltools.converters.keras.convert('SampleReg.h5')
coreml_model.save('SampleRegonCoreML.mlmodel')
3: CoreML에서 모델 사용
Xcode를 시작하고 iOS 프로젝트를 새로 만든 다음 파일 목록에 방금 만든 .mlmodel 파일을 추가합니다.
이 .mlmodel 파일을 클릭하면 아래 그림과 같이 모델 개요가 표시됩니다.
입력(Inputs)으로서 9개의 변수를 취해, 출력(Outputs)으로서 1개의 변수를 내는 모델인 것을 확인할 수 있습니다.
MultiArray라는 것은 MLMultiArray라고 하는 CoreML의 클래스를 가리키는 것 같고, 이것은 모델의 입출력을 취급하기 위한 다차원 배열의 클래스가 됩니다. 모양(Shape)이나 데이터형을 지정하여 배열을 만들 수 있습니다.
이제 이 모델을 사용하여 실제로 예측을 수행합니다. 아래 코드를 참조하십시오.
import CoreML
// .mlmodelファイルを追加した時点でモデルと同じ名前のクラスが自動的に生成され、
// さらにそれらの入力データ/出力データを扱うクラスも作られます(名前は「モデル名+Input/Output」)。
let model = SampleRegonCoreML()
// MLMultiArrayはこのように配列形状とデータ型を指定して初期化することができます。
// let inputArray = try! MLMultiArray(shape: [9], dataType: MLMultiArrayDataType.double)
// 一方で従来の配列から直接作ることもできます。今回は元のデータセットから抜き出した1データについて直打ちしてみました。
let inputArray = try! MLMultiArray([1.483887,1.578444,2.890853,1.925289,-0.559020,-1.604642,0.774676,-0.465148,-0.495225])
// 上の配列を用意したモデルの入力としてあてがいます。
let inputToModel: SampleRegonCoreMLInput = try! SampleRegonCoreMLInput(input1: inputArray)
// 予測を行い、その結果を出力します。
if let prediction = try? model.prediction(input: inputToModel) {
print(prediction.output1)
}
Keras측에서 같은 데이터에 대해 model.predict()한 결과와 상기 코드에 의해 출력되는 결과가 일치하는지 확인합니다.
Reference
이 문제에 관하여(【Swift】Keras로 만든 회귀 모델을 CoreML에서 사용할 때까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kirikabu_ueda/items/1060da8110fea7aab35e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import CoreML
// .mlmodelファイルを追加した時点でモデルと同じ名前のクラスが自動的に生成され、
// さらにそれらの入力データ/出力データを扱うクラスも作られます(名前は「モデル名+Input/Output」)。
let model = SampleRegonCoreML()
// MLMultiArrayはこのように配列形状とデータ型を指定して初期化することができます。
// let inputArray = try! MLMultiArray(shape: [9], dataType: MLMultiArrayDataType.double)
// 一方で従来の配列から直接作ることもできます。今回は元のデータセットから抜き出した1データについて直打ちしてみました。
let inputArray = try! MLMultiArray([1.483887,1.578444,2.890853,1.925289,-0.559020,-1.604642,0.774676,-0.465148,-0.495225])
// 上の配列を用意したモデルの入力としてあてがいます。
let inputToModel: SampleRegonCoreMLInput = try! SampleRegonCoreMLInput(input1: inputArray)
// 予測を行い、その結果を出力します。
if let prediction = try? model.prediction(input: inputToModel) {
print(prediction.output1)
}
Reference
이 문제에 관하여(【Swift】Keras로 만든 회귀 모델을 CoreML에서 사용할 때까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kirikabu_ueda/items/1060da8110fea7aab35e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)