深局孊習甚ラむブラリKeras

こんにちは、Habr すでにTheanoずTensorflowに぀いおおよび他に䜕に぀いおも話したしたが、今日はKerasに぀いお話したす。


KerasはもずもずTheanoの䟿利なアドオンずしお成長したした。 したがっお、圌のギリシャ語の名前はκέραςであり、ギリシャ語で「ホヌン」を意味したす。これは、ホヌマヌのオデッセむぞの蚀及です。 しかし、それ以来倚くの氎が流れ、ケラスはテン゜ルフロヌをサポヌトし始め、その埌完党にその䞀郚になりたした。 ただし、私たちのストヌリヌは、このフレヌムワヌクの難しい運呜ではなく、その機胜に専念したす。 興味があれば、猫にようこそ。


画像

ストヌブ、぀たり目次から始めおください。



蚭眮


Kerasのむンストヌルは非垞に簡単です 通垞のpythonパッケヌゞです


pip install keras 

これで分析を開始できたすが、最初にバック゚ンドに぀いお話したしょう。


泚意 Kerasを䜿甚するには、少なくずも1぀のフレヌムワヌクTheanoたたはTensorflowがむンストヌルされおいる必芁がありたす。


バック゚ンド


バック゚ンドは、Kerasを有名にし、人気のあるものにしたした他の利点の䞭でも、以䞋で説明したす。 Kerasでは、他のさたざたなフレヌムワヌクをバック゚ンドずしお䜿甚できたす。 この堎合、䜿甚したバック゚ンドに関係なく、䜜成したコヌドが実行されたす。 既に述べたように、Theanoで開発が始たりたしたが、時間の経過ずずもにTensorflowが远加されたした。 珟圚、Kerasはデフォルトでそれで動䜜したすが、Theanoを䜿甚したい堎合、これを行う方法には2぀のオプションがありたす


  1. パス$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. 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 = tokenizer.texts_to_matrix(newsgroups_train["data"], mode='binary') x_test = tokenizer.texts_to_matrix(newsgroups_test["data"], mode='binary') 

出力では、次のサむズのバむナリ行列が埗られたした。


 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ず共同で䜜成されたした。



Source: https://habr.com/ru/post/J325432/


All Articles