ããã«ã¡ã¯ãHabrïŒ ãã§ã«TheanoãšTensorflowã«ã€ããŠïŒããã³ä»ã«äœã«ã€ããŠãïŒè©±ããŸããããä»æ¥ã¯Kerasã«ã€ããŠè©±ããŸãã
Kerasã¯ããšããšTheanoã®äŸ¿å©ãªã¢ããªã³ãšããŠæé·ããŸããã ãããã£ãŠã圌ã®ã®ãªã·ã£èªã®ååã¯ÎºÎÏαÏã§ãããã®ãªã·ã£èªã§ãããŒã³ããæå³ããŸããããã¯ãããŒããŒã®ãªããã»ã€ãžã®èšåã§ãã ãããããã以æ¥å€ãã®æ°Žãæµããã±ã©ã¹ã¯ãã³ãœã«ãããŒããµããŒããå§ãããã®åŸå®å
šã«ãã®äžéšã«ãªããŸããã ãã ããç§ãã¡ã®ã¹ããŒãªãŒã¯ããã®ãã¬ãŒã ã¯ãŒã¯ã®é£ããéåœã§ã¯ãªãããã®æ©èœã«å°å¿µããŸãã èå³ãããã°ãç«ã«ããããã
ã¹ããŒããã€ãŸãç®æ¬¡ããå§ããŠãã ããã
- [ã€ã³ã¹ããŒã«]
- [ããã¯ãšã³ã]
- [å®çšäŸ]
- [ããŒã¿]
- [ã¢ãã«]
- [ã·ãŒã±ã³ã·ã£ã«API]
- [æ©èœAPI]
- [äœæ¥çšã¢ãã«ã®æºå]
- [ã«ã¹ã¿ã æ倱]
- [ãã¬ãŒãã³ã°ãšãã¹ã]
- [ã³ãŒã«ããã¯]
- [é«åºŠãªã«ãŠã³ã]
- [çµè«]
èšçœ®
Kerasã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ã éåžžã®pythonããã±ãŒãžã§ãïŒ
pip install keras
ããã§åæãéå§ã§ããŸãããæåã«ããã¯ãšã³ãã«ã€ããŠè©±ããŸãããã
泚æïŒ Kerasã䜿çšããã«ã¯ãå°ãªããšã1ã€ã®ãã¬ãŒã ã¯ãŒã¯ïŒTheanoãŸãã¯TensorflowïŒãã€ã³ã¹ããŒã«ãããŠããå¿
èŠããããŸãã
ããã¯ãšã³ã
ããã¯ãšã³ãã¯ãKerasãæåã«ãã人æ°ã®ãããã®ã«ããŸããïŒä»ã®å©ç¹ã®äžã§ãã以äžã§èª¬æããŸãïŒã Kerasã§ã¯ãä»ã®ããŸããŸãªãã¬ãŒã ã¯ãŒã¯ãããã¯ãšã³ããšããŠäœ¿çšã§ããŸãã ãã®å Žåã䜿çšããããã¯ãšã³ãã«é¢ä¿ãªããäœæããã³ãŒããå®è¡ãããŸãã æ¢ã«è¿°ã¹ãããã«ãTheanoã§éçºãå§ãŸããŸããããæéã®çµéãšãšãã«Tensorflowãè¿œå ãããŸããã çŸåšãKerasã¯ããã©ã«ãã§ããã§åäœããŸãããTheanoã䜿çšãããå Žåããããè¡ãæ¹æ³ã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸãïŒ
- ãã¹
$HOME/.keras/keras.json
ïŒãŸãã¯Windowsãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®å Žåã¯%USERPROFILE%\.keras\keras.json
ïŒã«ããkeras.jsonæ§æãã¡ã€ã«ãç·šéããŸãã backend
ãã£ãŒã«ããå¿
èŠã§ãã
{ "image_data_format": "channels_last", "epsilon": 1e-07, "floatx": "float32", "backend": "theano" }
- 2çªç®ã®æ¹æ³ã¯ã
KERAS_BACKEND
ç°å¢KERAS_BACKEND
ã次ã®ããã«èšå®ããããšKERAS_BACKEND
ã
KERAS_BACKEND=theano python -c "from keras import backend" Using Theano backend.
çŸåšãMicrosoftããCNTKã®ãã€ã³ããŒãäœæããäœæ¥ãè¡ãããŠããããšã¯æ³šç®ã«å€ããããããã°ãããããšå¥ã®ããã¯ãšã³ããå©çšå¯èœã«ãªããŸãã ãã¡ããã芧ãã ãã ã
MXNet Kerasããã¯ãšã³ãããããŸãããããã«ã¯ãŸã ãã¹ãŠã®æ©èœããããŸããããMXNetã䜿çšããŠããå Žåã¯ããã®å¯èœæ§ã«æ³šæãæãããšãã§ããŸãã
ãŸããGPUãæèŒãããã·ã³ã§ãã©ãŠã¶ãããã¬ãŒãã³ã°æžã¿ã®Kerasã¢ãã«ãå®è¡ã§ããèå³æ·±ãKeras.jsãããžã§ã¯ãããããŸãã
ãããã£ãŠãKerasããã¯ãšã³ãã¯æ¡å€§ããæéããããŠäžçãåŒãç¶ããŸãïŒ ïŒããããããã¯äžæ£ç¢ºã§ããïŒ
å®çšäŸ
以åã®èšäºã§ã¯ãèšè¿°ããããã¬ãŒã ã¯ãŒã¯ã§ã®æ©æ¢°åŠç¿ã®å€å
žçãªã¢ãã«ã®äœæ¥ã®èª¬æã«å€ãã®æ³šæãæãããŸããã ä»ã§ã¯ã[ããã§ã¯ãªã]ãã£ãŒããã¥ãŒã©ã«ãããã¯ãŒã¯ãäŸã«åãããšãã§ããããã§ãã
ããŒã¿
æ©æ¢°åŠç¿ã®ã¢ãã«ã®åŠç¿ã¯ãããŒã¿ããå§ãŸããŸãã Kerasã«ã¯å
éšã«ããã€ãã®ãã¬ãŒãã³ã°ããŒã¿ã»ãããå«ãŸããŠããŸããããããã¯ãã§ã«ä»äºã«äŸ¿å©ãªåœ¢ã«ãªã£ãŠãããããKerasã®å
šåãçºæ®ããããšã¯ã§ããŸããã ãããã£ãŠãããçã®ããŒã¿ã»ããã䜿çšããŸãã ããã¯20ã®ãã¥ãŒã¹ã°ã«ãŒãã®ããŒã¿ã»ããã«ãªããŸã-Usenetã°ã«ãŒãããã®2äžã®ãã¥ãŒã¹ã¡ãã»ãŒãžïŒããã¯1990幎代ã®ã¡ãŒã«äº€æã·ã¹ãã ã§ãããFIDOã«äŒŒãŠããŸããããããèªè
ã«ã¯å°ã銎æã¿ããããŸãïŒã¯ã20ã®ã«ããŽãªã«ã»ãŒåçã«åæ£ãããŸãã ãããã®ãã¥ãŒã¹ã°ã«ãŒãéã§ã¡ãã»ãŒãžãæ£ããé
ä¿¡ãããããããã¯ãŒã¯ã«æããŸãã
from sklearn.datasets import fetch_20newsgroups newsgroups_train = fetch_20newsgroups(subset='train') newsgroups_test = fetch_20newsgroups(subset='test')
ãã¬ãŒãã³ã°ã»ããã®ããã¥ã¡ã³ãã®å
容ã®äŸã次ã«ç€ºããŸãã
newsgroups_train ['data'] [0]FromïŒlerxst@wam.umd.eduïŒç§ã®ããšã¯ã©ãã§ããïŒ
件åïŒããã¯äœã®è»ã§ããïŒïŒ
Nntpæçš¿ãã¹ãïŒrac3.wam.umd.edu
çµç¹ïŒã¡ãªãŒã©ã³ã倧åŠã«ã¬ããžããŒã¯
è¡ïŒ15
ç§ãèŠããã®è»ã§ç§ãåçºã§ãã人ã¯ããªãããšæã£ãŠããŸãã
å
æ¥ã 60幎代åŸåã®ããã«èŠãã2ãã¢ã¹ããŒãã«ãŒã§ãã/
70幎代ååã ããã¯ããªã¯ãªã³ãšåŒã°ããŠããŸããã ãã¢ã¯æ¬åœã«å°ããã£ãã ããã«ã
ããã³ããã³ããŒã¯ä»ã®éšåããåé¢ãããŠããŸããã ããã¯
ç§ãç¥ã£ãŠãããã¹ãŠã 誰ããã¢ãã«åããšã³ãžã³ã®ä»æ§ã幎ãæããŠãããã°
çç£ããã®è»ãäœãããå ŽæãæŽå²ããŸãã¯ããªããã©ããªæ
å ±ã§ã
ãã®ãã¡ã³ããŒãªè»ã«ä¹ã£ãŠãã¡ãŒã«ããŠãã ããã
ãããã§ã
- IL
-ããªãã®è¿æã®Lerxstããæã£ãŠãã----
ååŠç
Kerasã«ã¯ãããã¹ããåçãæç³»åãã€ãŸãæãäžè¬çãªããŒã¿åã®äŸ¿å©ãªååŠçã®ããã®ããŒã«ãå«ãŸããŠããŸãã ä»æ¥ãç§ãã¡ã¯ããã¹ãã§äœæ¥ããŠããã®ã§ãããããããŒã¯ã³ã«åå²ãããããªãã¯ã¹åœ¢åŒã«ããå¿
èŠããããŸãã
tokenizer = Tokenizer(num_words=max_words) tokenizer.fit_on_texts(newsgroups_train["data"])
åºåã§ã¯ã次ã®ãµã€ãºã®ãã€ããªè¡åãåŸãããŸããã
x_train shape: (11314, 1000) x_test shape: (7532, 1000)
æåã®æ°åã¯ãµã³ãã«å
ã®ããã¥ã¡ã³ãã®æ°ã§ããã2çªç®ã¯èŸæžã®ãµã€ãºïŒãã®äŸã§ã¯1,000ïŒã§ãã
ãŸããã¯ãã¹ãšã³ããããŒã䜿çšããŠåŠç¿ããããã«ãã¯ã©ã¹ã©ãã«ãè¡å圢åŒã«å€æããå¿
èŠããããŸãã ãããè¡ãããã«ãã¯ã©ã¹çªå·ãããããã¯ã³ããããã¯ãã«ã«å€æããŸãã ãŒããš1åäœã§æ§æããããã¯ãã«ïŒ
y_train = keras.utils.to_categorical(newsgroups_train["target"], num_classes) y_test = keras.utils.to_categorical(newsgroups_test["target"], num_classes)
åºåã§ã¯ããããã®ãµã€ãºã®ãã€ããªè¡åãååŸããŸãã
y_train shape: (11314, 20) y_test shape: (7532, 20)
ã芧ã®ãšããããããã®è¡åã®ãµã€ãºã¯ããŒã¿è¡åïŒæåã®åº§æšã§ã¯ããã¬ãŒãã³ã°ãµã³ãã«ãšãã¹ããµã³ãã«ã®ããã¥ã¡ã³ãæ°ïŒãšéšåçã«äžèŽããéšåçã«ã¯äžèŽããŸããã 2çªç®ã®åº§æšã«ã¯ãã¯ã©ã¹ã®æ°ããããŸãïŒããŒã¿ã»ããã®ååã瀺ããšããã20ïŒã
ããã§ããããã¯ãŒã¯ãæããŠãã¥ãŒã¹ãåé¡ããæºåãã§ããŸããïŒ
ã¢ãã«
Kerasã®ã¢ãã«ã¯ãäž»ã«2ã€ã®æ¹æ³ã§èª¬æã§ããŸãã
ã·ãŒã±ã³ã·ã£ã«API
1ã€ç®ã¯ãããšãã°æ¬¡ã®ãããªã¢ãã«ã®é£ç¶çãªèª¬æã§ãã
model = Sequential() model.add(Dense(512, input_shape=(max_words,))) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes)) model.add(Activation('softmax'))
ãŸãã¯ãã®ããã«ïŒ
model = Sequential([ Dense(512, input_shape=(max_words,)), Activation('relu'), Dropout(0.5), Dense(num_classes), Activation('softmax') ])
æ©èœçãªAPI
å°ãåã«ãæ©èœçãªAPIã䜿çšããŠã¢ãã«ãäœæããããšãå¯èœã«ãªããŸãã-2çªç®ã®æ¹æ³ïŒ
a = Input(shape=(max_words,)) b = Dense(512)(a) b = Activation('relu')(b) b = Dropout(0.5)(b) b = Dense(num_classes)(b) b = Activation('softmax')(b) model = Model(inputs=a, outputs=b)
æ¹æ³ã®éã«æ ¹æ¬çãªéãã¯ãããŸãã;奜ã¿ã®æ¹æ³ãéžæããŠãã ããã
Model
ã¯ã©ã¹ïŒããã³ãã®ã¯ã©ã¹ããç¶æ¿ãããSequential
ïŒã«ã¯ãmodel- model.layers
ãinputs- model.inputs
ãoutputs- model.outputs
å«ãŸããã¬ã€ã€ãŒã確èªã§ãã䟿å©ãªã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
ãŸããã¢ãã«ã衚瀺ããã³ä¿åããããã®éåžžã«äŸ¿å©ãªæ¹æ³ã¯model.to_yaml
ã§ãã
ãã¿ãã¬ã®äžã§ãç§ãã¡ã®ã¢ãã«ã«å¯Ÿãããã®çµè«ã backend: tensorflow class_name: Model config: input_layers: - [input_4, 0, 0] layers: - class_name: InputLayer config: batch_input_shape: !!python/tuple [null, 1000] dtype: float32 name: input_4 sparse: false inbound_nodes: [] name: input_4 - class_name: Dense config: activation: linear activity_regularizer: null bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null kernel_constraint: null kernel_initializer: class_name: VarianceScaling config: {distribution: uniform, mode: fan_avg, scale: 1.0, seed: null} kernel_regularizer: null name: dense_10 trainable: true units: 512 use_bias: true inbound_nodes: - - - input_4 - 0 - 0 - {} name: dense_10 - class_name: Activation config: {activation: relu, name: activation_9, trainable: true} inbound_nodes: - - - dense_10 - 0 - 0 - {} name: activation_9 - class_name: Dropout config: {name: dropout_5, rate: 0.5, trainable: true} inbound_nodes: - - - activation_9 - 0 - 0 - {} name: dropout_5 - class_name: Dense config: activation: linear activity_regularizer: null bias_constraint: null bias_initializer: class_name: Zeros config: {} bias_regularizer: null kernel_constraint: null kernel_initializer: class_name: VarianceScaling config: {distribution: uniform, mode: fan_avg, scale: 1.0, seed: null} kernel_regularizer: null name: dense_11 trainable: true units: !!python/object/apply:numpy.core.multiarray.scalar - !!python/object/apply:numpy.dtype args: [i8, 0, 1] state: !!python/tuple [3, <, null, null, null, -1, -1, 0] - !!binary | FAAAAAAAAAA= use_bias: true inbound_nodes: - - - dropout_5 - 0 - 0 - {} name: dense_11 - class_name: Activation config: {activation: softmax, name: activation_10, trainable: true} inbound_nodes: - - - dense_11 - 0 - 0 - {} name: activation_10 name: model_1 output_layers: - [activation_10, 0, 0] keras_version: 2.0.2
ããã«ãããã¢ãã«ã人éãèªãã圢åŒã§ä¿åãããã®èª¬æããã¢ãã«ãã€ã³ã¹ã¿ã³ã¹åã§ããŸãã
from keras.models import model_from_yaml yaml_string = model.to_yaml() model = model_from_yaml(yaml_string)
ããã¹ã圢åŒã§ä¿åãããã¢ãã«ïŒã¡ãªã¿ã«ãJSONã§ä¿åããããšãã§ããŸãïŒã«ã¯éã¿ãå«ãŸããŠããªãããšã«æ³šæããããšãéèŠã§ãã ãŠã§ã€ããä¿åããã³ããŒãããã«ã¯load_weights
ããããsave_weights
ããã³load_weights
䜿çšããŸãã
ã¢ãã«ã®å¯èŠå
èŠèŠåãç¡èŠããããšã¯ã§ããŸããã Kerasã«ã¯ãã¢ãã«ã®ãã«ãã€ã³ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ããããŸãã
from keras.utils import plot_model plot_model(model, to_file='model.png', show_shapes=True)
ãã®ã³ãŒãã¯ã次ã®ç»åãmodel.png
ãšããŠä¿åããŸãã
ããã§ã¯ãã¬ã€ã€ãŒã®å
¥åãšåºåã®ãµã€ãºãè¿œå ã§è¡šç€ºããŸããã None
ããµã€ãºã®ã¿ãã«ã§æåã«è¡ã-ããã¯ãããã®æ¬¡å
ã§ãã ãªããªã None
䟡å€ãããå Žåããããã¯ä»»æã§ãã
jupyter
ã©ãããããã§è¡šç€ºããå Žåã¯ãå°ãç°ãªãã³ãŒããå¿
èŠã§ãã
from IPython.display import SVG from keras.utils.vis_utils import model_to_dot SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))
èŠèŠåã«ã¯ãgraphpyzããã±ãŒãžãšpython pydotããã±ãŒãžãå¿
èŠã§ããããšã«æ³šæããããšãéèŠã§ãã ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ãæ£ããpydot
ããããã«ã¯ããªããžããªããpydot
ããã±ãŒãžãæ©èœããªãããã pydot-ng
æŽæ°ããŒãžã§ã³ãååŸããå¿
èŠããããšãã埮åŠãªç¹ããããŸãã
pip install pydot-ng
Ubuntuã®graphviz
ããã±ãŒãžã¯ã次ã®ããã«é
眮ãããŸãïŒä»ã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ãåæ§ïŒã
apt install graphviz
MacOSïŒHomeBrewããã±ãŒãžã·ã¹ãã ã䜿çšïŒïŒ
brew install graphviz
Windowsã®ã€ã³ã¹ããŒã«æé ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã
äœæ¥ã®ããã®ã¢ãã«ã®æºå
ãã®ãããã¢ãã«ãäœæããŸããã ä»ãããªãã¯ä»äºã®ããã«ãããæºåããå¿
èŠããããŸãïŒ
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
compile
é¢æ°ã®ãã©ã¡ãŒã¿ãŒã¯ã©ãããæå³ã§ããïŒ loss
ã¯èª€å·®ã®é¢æ°ã§ãããç§ãã¡ã®å Žåãããã¯ã¯ãã¹ãšã³ããããŒã§ãããããªãã¯ã¹ã®åœ¢ã§ã©ãã«ãæºåããã®ã¯åœŒå¥³ã®ããã§ããã optimizer
-䜿çšãããoptimizer
éåžžã®ç¢ºççåŸé
éäžããããŸãããAdamã¯ãã®ã¿ã¹ã¯ã§æé«ã®åæã瀺ããŸãã metrics
-ã¢ãã«ã®å質ãèæ
®ãããmetrics
ãã®å Žåã粟床ãã€ãŸãæ£ããæšæž¬ãããåçã®å²åã§ãã
ã«ã¹ã¿ã æ倱
Kerasã«ã¯äžè¬çãªãšã©ãŒæ©èœã®ã»ãšãã©ãå«ãŸããŠããŸãããã¿ã¹ã¯ã«ã¯ç¬èªã®ãã®ãå¿
èŠã«ãªãå ŽåããããŸãã ããªãèªèº«ã®loss
ãäœãããã«ãããªãã¯å°ãå¿
èŠã§ãïŒæ£è§£ãšäºæž¬ãããçãã®ãã¯ãã«ãåããåºåããšã«åäžã®æ°ãçæããé¢æ°ãå®çŸ©ããã ãã§ãã ãã¬ãŒãã³ã°ã®ããã«ãã¯ãã¹ãšã³ããããŒãèšç®ããé¢æ°ãäœæããŸãã äœããã®æ¹æ³ã§ãããå€ããããã«ãããããã¯ãªããã³ã°ãå°å
¥ããŸã-ãã¯ãã«ã®å€ãäžäžã«ããªãã³ã°ããŸãã ã¯ããå¥ã®éèŠãªãã€ã³ãïŒéæšæºã®loss
ã¯ãåºç€ãšãªããã¬ãŒã ã¯ãŒã¯ã®èŠ³ç¹ãã説æããããã«å¿
èŠãªå ŽåããããŸãããKerasã§å¯ŸåŠã§ããŸãã
from keras import backend as K epsilon = 1.0e-9 def custom_objective(y_true, y_pred): '''Yet another cross-entropy''' y_pred = K.clip(y_pred, epsilon, 1.0 - epsilon) y_pred /= K.sum(y_pred, axis=-1, keepdims=True) cce = categorical_crossentropy(y_pred, y_true) return cce
ããã§ã y_true
ããã³y_pred
ã¯y_pred
ãã³ãœã«ã§ãããããTensorflowé¢æ°ã䜿çšããŠããããåŠçããŸãã
å¥ã®æ倱é¢æ°ã䜿çšããã«ã¯ã compile
é¢æ°ã®loss
ãã©ã¡ãŒã¿ãŒã®å€ãå€æŽããããã«æ倱é¢æ°ã®ãªããžã§ã¯ããæž¡ããŸãïŒé¢æ°ã®pythonã«ã¯ãªããžã§ã¯ãããããŸãããããã¯ãŸã£ããå¥ã®è©±ã§ããïŒïŒ
model.compile(loss=custom_objective, optimizer='adam', metrics=['accuracy'])
ãã¬ãŒãã³ã°ãšãã¹ã
æåŸã«ãã¢ãã«ããã¬ãŒãã³ã°ããŸãã
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.1)
fit
ã¡ãœããã¯ãŸãã«ãããè¡ããŸãã ã©ãã«x_train
ããã³y_train
ããããbatch_size
ããããbatch_size
ãäžåºŠã«éä¿¡ããããµã³ãã«ã®æ°ããšããã¯ãåŠç¿ããããã®ãšããã¯ã®æ°ïŒ1ã€ã®æ代ã¯ã¢ãã«ã«ãã£ãŠ1åå®å
šã«æž¡ããããã¬ãŒãã³ã°ãµã³ãã«ïŒãå¶éããã©ãã«ãšãšãã«ããã¬ãŒãã³ã°ãµã³ãã«ãå
¥åãšããŠåãå
¥ããŸãæ€èšŒã«äžãããã¬ãŒãã³ã°ãµã³ãã«ã®å²åã¯validation_split
ã§ãã
ãã®ã¡ãœããã¯history
è¿ããŸã-ããã¯ããã¬ãŒãã³ã°ã®åã¹ãããã§ã®ãšã©ãŒã®å±¥æŽã§ãã
ãããŠæåŸã«ããã¹ãã evaluate
ã¡ãœããã¯ããã¹ãéžæãšãã®ã©ãã«ãå
¥åãšããŠåãåããŸãã ã¡ããªãã¯ã¯äœæ¥ã®æºåã§èšå®ããããããä»ã«äœãå¿
èŠãããŸããã ïŒãã ãããããã®ãµã€ãºãæå®ããŸãïŒã
score = model.evaluate(x_test, y_test, batch_size=batch_size)
ã³ãŒã«ããã¯
ãŸããKerasã®ã³ãŒã«ããã¯ãªã©ã®éèŠãªæ©èœã«ã€ããŠãå°ã説æããå¿
èŠããããŸãã ããããéããŠå€ãã®äŸ¿å©ãªæ©èœãå®è£
ãããŠããŸãã ããšãã°ãéåžžã«é·ãæéãããã¯ãŒã¯ããã¬ãŒãã³ã°ããŠããå ŽåãããŒã¿ã»ããã®ãšã©ãŒãæžå°ããªããªã£ãå Žåããã€åæ¢ããããç解ããå¿
èŠããããŸãã è±èªã§ã¯ã説æãããŠããæ©èœã¯ãæ©æåæ¢ããšåŒã°ããŸãã ãããã¯ãŒã¯ããã¬ãŒãã³ã°ãããšãã«ãã©ã®ããã«é©çšã§ãããèŠãŠã¿ãŸãããã
from keras.callbacks import EarlyStopping early_stopping=EarlyStopping(monitor='value_loss') history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.1, callbacks=[early_stopping])
å®éšãè¡ãããã®äŸã§æ©æåæ¢ãã©ã®ããã«æ©èœãããã確èªããŠãã ããã
ãã³ãœã«ããŒã
Tensorboardã«äŸ¿å©ãªåœ¢åŒã®ãã°ä¿åãã³ãŒã«ããã¯ãšããŠäœ¿çšããããšãã§ããŸãïŒç°¡åã«èšãã°ãTensorflowã«é¢ããèšäºã§èª¬æããŸãã-ããã¯Tensorflowãã°ããã®æ
å ±ãåŠçããã³èŠèŠåããããã®ç¹å¥ãªãŠãŒãã£ãªãã£ã§ãïŒã
from keras.callbacks import TensorBoard tensorboard=TensorBoard(log_dir='./logs', write_graph=True) history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.1, callbacks=[tensorboard])
ãã¬ãŒãã³ã°ãçµäºãTensorboard
ïŒãŸãã¯ãã®éçšã§ïŒïŒã Tensorboard
ãèµ·åããŠããã°ãå«ããã£ã¬ã¯ããªãžã®çµ¶å¯Ÿãã¹ãæå®ã§ããŸãã
tensorboard --logdir=/path/to/logs
ããšãã°ãæ€èšŒãµã³ãã«ã®ã¿ãŒã²ããã¡ããªãã¯ãã©ã®ããã«å€æŽããããã確èªã§ããŸãã

ïŒãšããã§ãããã§ã¯ããããã¯ãŒã¯ãåãã¬ãŒãã³ã°ãããŠããããšãããããŸããïŒ
é«åºŠãªã°ã©ã
次ã«ãå°ãè€éãªèšç®ã°ã©ããäœæããããšãæ€èšããŠãã ããã ãã¥ãŒã©ã«ãããã¯ãŒã¯ã«ã¯å€ãã®å
¥åãšåºåããããå
¥åããŒã¿ã¯ããŸããŸãªãããã³ã°ã«ãã£ãŠå€æã§ããŸãã è€éãªã°ã©ãã®äžéšãåå©çšããããã«ïŒç¹ã«ã transfer learning
ããã«ïŒãã¢ãã«ã®äžéšãæ°ããå
¥åããŒã¿ã«ç°¡åã«æœåºãä¿åãé©çšã§ããã¢ãžã¥ã©ãŒã¹ã¿ã€ã«ã§ã¢ãã«ãèšè¿°ããããšã¯çã«ããªã£ãŠããŸãã
åè¿°ã®Functional API
ãšSequential API
äž¡æ¹ã®æ¹æ³ãçµã¿åãããŠã¢ãã«ãèšè¿°ããã®ãæã䟿å©ã§ãã
äŸãšããŠã·ã£ã ãããã¯ãŒã¯ã¢ãã«ã䜿çšãããã®ã¢ãããŒããæ€èšããŠãã ããã æçšãªããããã£ãæã€ãã¯ãã«è¡šçŸãååŸããããã«ãåæ§ã®ã¢ãã«ãå®éã«ç©æ¥µçã«äœ¿çšãããŠããŸãã ããšãã°ãåæ§ã®ã¢ãã«ã䜿çšããŠãé¡ã®åçããã¯ãã«ã§è¡šç€ºããŠãé¡äŒŒããé¡ã®ãã¯ãã«ãäºãã«è¿ããªãããã«ããæ¹æ³ãåŠç¿ã§ããŸãã ç¹ã«ãFindFaceãªã©ã®ç»åæ€çŽ¢ã¢ããªã±ãŒã·ã§ã³ã¯ãããå©çšããŸãã
ã¢ãã«ã®å³ã¯å³ã§èŠãããšãã§ããŸãïŒ

ããã§ãé¢æ°G
ã¯å
¥åç»åããã¯ãã«ã«å€æãããã®åŸãç»åã®ãã¢ã®ãã¯ãã«éã®è·é¢ãèšç®ãããŸãã åçãåãã¯ã©ã¹ããã®ãã®ã§ããå Žåãè·é¢ãæå°åããå¿
èŠããããç°ãªãã¯ã©ã¹ããã®ãã®ã§ããå Žåãæ倧åããå¿
èŠããããŸãã
ãã®ãããªãã¥ãŒã©ã«ãããã¯ãŒã¯ããã¬ãŒãã³ã°ããåŸããã¯ãã«G(x)
ã®åœ¢åŒã§ä»»æã®ç»åãæ瀺ãããã®è¡šçŸã䜿çšããŠæãè¿ãç»åãæ€çŽ¢ããããä»ã®æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ã®ç¹åŸŽãã¯ãã«ãšããŠäœ¿çšã§ããŸãã
ããã«å¿ããŠã³ãŒãã§ã¢ãã«ãèšè¿°ãããã¥ãŒã©ã«ãããã¯ãŒã¯ã®äžéšãæœåºããŠåå©çšããããšãå¯èœãªéãç°¡åã«ããŸãã
ãŸããå
¥åãã¯ãã«ããããããé¢æ°ãKerasã§å®çŸ©ããŸãã
def create_base_network(input_dim): seq = Sequential() seq.add(Dense(128, input_shape=(input_dim,), activation='relu')) seq.add(Dropout(0.1)) seq.add(Dense(128, activation='relu')) seq.add(Dropout(0.1)) seq.add(Dense(128, activation='relu')) return seq
æ³šïŒ Sequential API
ã䜿çšããŠã¢ãã«ã説æããŸãããããã®äœæãé¢æ°ã§ã©ããããŸããã ãã®é¢æ°ãåŒã³åºãããšã§ãã®ãããªã¢ãã«ãäœæãã Functional API
ãFunctional API
ããŠå
¥åããŒã¿ã«é©çšããããšãã§ããŸãã
base_network = create_base_network(input_dim) input_a = Input(shape=(input_dim,)) input_b = Input(shape=(input_dim,)) processed_a = base_network(input_a) processed_b = base_network(input_b)
ããã§ãå€æ°processed_a
ããã³processed_b
ã¯ã以åã«å®çŸ©ãããããã¯ãŒã¯ãå
¥åããŒã¿ã«é©çšããããšã«ãã£ãŠååŸããããã¯ãã«è¡šçŸãå«ãŸããŸãã
ãããã®éã®è·é¢ãèšç®ããå¿
èŠããããŸãã ãããè¡ãããã«ãKerasã¯ä»»æã®åŒãã¬ã€ã€ãŒïŒ Layer
ïŒãšããŠè¡šãLambda
ã©ãããŒé¢æ°ãæäŸããŸãã ããŒã¿ããããã§åŠçããããšãå¿ããªãã§ãã ãããããã«ããããã¹ãŠã®ãã³ãœã«ã«ã¯åžžã«è¿œå ã®æ¬¡å
ããããããããããã®ãµã€ãºã決å®ããŸãã
from keras import backend as K def euclidean_distance(vects): x, y = vects return K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True)) distance = Lambda(euclidean_distance)([processed_a, processed_b])
ããŠãå
éšè¡šçŸéã®è·é¢ãååŸããŸããããå
¥åãšè·é¢ã1ã€ã®ã¢ãã«ã«åéããããšãæ®ã£ãŠããŸãã
model = Model([input_a, input_b], distance)
ã¢ãžã¥ã©ãŒæ§é ã®ãããã§ã base_network
åå¥ã«äœ¿çšã§ããŸããããã¯ãã¢ãã«ã®ãã¬ãŒãã³ã°åŸã«ç¹ã«åœ¹ç«ã¡ãŸãã ãããã©ã®ããã«è¡ãããšãã§ããŸããïŒ ã¢ãã«ã®ã¬ã€ã€ãŒãèŠãŠã¿ãŸãããã
>>> model.layers [<keras.engine.topology.InputLayer object at 0x7f238fdacb38>, <keras.engine.topology.InputLayer object at 0x7f238fdc34a8>, <keras.models.Sequential object at 0x7f239127c3c8>, <keras.layers.core.Lambda object at 0x7f238fddc4a8>]
models.Sequential
ã¿ã€ãã®ãªã¹ãã«3çªç®ã®ãªããžã§ã¯ãããããŸãã ããã¯ãå
¥åç»åããã¯ãã«ã§è¡šç€ºããã¢ãã«ã§ãã ãããæœåºããŠæ¬æ Œçãªã¢ãã«ãšããŠäœ¿çšããã«ã¯ïŒåãã¬ãŒãã³ã°ãæ€èšŒãå¥ã®ã°ã©ãã«åã蟌ãããšãã§ããŸãïŒãã¬ã€ã€ãŒã®ãªã¹ããããããåŒãåºããŸãã
>>> embedding_model = model.layers[2] >>> embedding_model.layers [<keras.layers.core.Dense object at 0x7f23c4e557f0>, <keras.layers.core.Dropout object at 0x7f238fe97908>, <keras.layers.core.Dense object at 0x7f238fe44898>, <keras.layers.core.Dropout object at 0x7f238fe449e8>, <keras.layers.core.Dense object at 0x7f238fe01f60>]
ããšãã°ã base_model
åºåbase_model
ã2ã®MNISTããŒã¿ã§æ¢ã«ãã¬ãŒãã³ã°ãããã·ã£ã ãããã¯ãŒã¯ã®å Žåã次ã®ããã«ãã¯ãã«è¡šçŸãèŠèŠåã§ããŸãã
ããŒã¿ãããŒããã 28x28
ãµã€ãºã®ç»åããã©ãããã¯ãã«ã«çž®å°ããŸãã
(x_train, y_train), (x_test, y_test) = mnist.load_data() x_test = x_test.reshape(10000, 784)
以åã«æœåºããã¢ãã«ã䜿çšããŠåçã衚瀺ããŸãã
embeddings = embedding_model.predict(x_test)
çŸåšã embeddings
ã¯2次å
ã®ãã¯ãã«ã§ãããå¹³é¢äžã«æç»ã§ããŸãã

ã·ã£ã ãããã¯ãŒã¯ã®å®å
šãªäŸã¯ããã§èŠãããŸã ã
ãããã«
ããã ãã§ããKerasã§æåã®ã¢ãã«ãäœããŸããïŒ åœŒãæäŸããæ©äŒãããªãã«èå³ãæã¡ãããªããããªãã®ä»äºã§ããã䜿ãããšãé¡ã£ãŠããŸãã
ã±ã©ã¹ã®é·æãšçæã«ã€ããŠè°è«ããæãæ¥ãŸããã æãããªå©ç¹ã«ã¯ãã¢ãã«äœæã®åçŽããå«ãŸãããããé«éã®ãããã¿ã€ãäœæã«ã€ãªãããŸãã ããšãã°ã è¡æã«é¢ããæè¿ã®èšäºã®èè
ã¯Kerasã䜿çšããŸããã äžè¬çã«ããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãŸããŸã人æ°ãé«ãŸã£ãŠããŸãã

ç§åŠèšäºãžã®èšåããå€æãããšãKerasã¯1幎ã§TorchãæããŠããã5幎ééçºäžã§ãã 圌ã®ç®æš-䜿ãããã-FrançoisCholletïŒFrançoisCholletãèè
KerasïŒãéæããããã§ãã ããã«ã圌ã®ã€ãã·ã¢ããã¯èŠéããããŸããã§ããïŒã»ãã®æ°ãæåŸãGoogleã¯TensorflowãéçºããŠããããŒã ã§ãããè¡ãããã«åœŒãæåŸ
ããŸããã ãŸããTensorflow 1.2ã§ã¯ãKerasã¯TFïŒtf.kerasïŒã«å«ãŸããŸãã
ãŸããçæã«ã€ããŠããã€ãã®èšèãèšããªããã°ãªããŸããã æ®å¿µãªãããã³ãŒãã®æ®éæ§ã«é¢ããKerasã®ã¢ã€ãã¢ã¯åžžã«æºããããŠããããã§ã¯ãããŸãããKeras2.0ã¯æåã®ããŒãžã§ã³ãšã®äºææ§ãå£ããŸããã éãã¯ãKerasã®å Žåã2çªç®ã®ããŒãžã§ã³ã®ã¿ãéçºçšã«éžæãããããšã§ãã ãŸããKerasã³ãŒãã¯Theanoãããã¯ããã«é
ãTensorflowã§å®è¡ãããŸãïŒãã ãããã¬ãŒã ã¯ãŒã¯ã¯å°ãªããšããã€ãã£ãã³ãŒãã«å¹æµããŸãïŒã
äžè¬ã«ãç¹å®ã®åé¡ã解決ããããã«ãããã¯ãŒã¯ãè¿
éã«æ§ç¯ããã³ãã¹ãããå¿
èŠãããå Žåã䜿çšããKerasãæšå¥šã§ããŸãã ãã ããéæšæºã¬ã€ã€ãŒãè€æ°ã®GPUãžã®ã³ãŒãã®äžŠååãªã©ãè€éãªãã®ãå¿
èŠãªå Žåã¯ãåºç€ãšãªããã¬ãŒã ã¯ãŒã¯ã䜿çšããããšããå§ãããŸãïŒå Žåã«ãã£ãŠã¯é¿ããããªãããšããããŸãïŒã
ãã®èšäºã®ã»ãšãã©ãã¹ãŠã®ã³ãŒãã¯ã ããã§ã¯åäžã®ã©ãããããã®åœ¢ãããŠããŸã ã ãŸãã Kerasã®ããã¥ã¡ã³ãïŒ keras.io ãããã³ãã®èšäºã®äž»ãªæ ¹æ ãšãªã£ãŠããå
¬åŒã®äŸã匷ããå§ãããŸãã
ãã®æçš¿ã¯ã Wordbearerãšå
±åã§äœæãããŸããã