Keras 3 : Keras 3 について (翻訳/解説)
翻訳 : クラスキャット セールスインフォメーション
作成日時 : 11/30/2023
* 本ページは、以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Website: www.classcat.com ; ClassCatJP
Keras 3 : Keras 3 について
Keras は Python で書かれた深層学習 API で、JAX, TensorFlow または PyTorch のいずれかの上で実行できます。
Keras は :
- 単純 (simple) です — しかし安直 (simplistic) ではありません。Keras は開発者の認知の (cognitive) 負荷を軽減して本当に重要である問題のパートにフォーカスできるようにします。
- 柔軟性 — Keras は複雑さを段階的に公開するという原則を採用しています: 単純なワークフローは素早く簡単である必要がありますが、一方で任意に高度なワークフローは貴方が既に学習したものの上に構築できる明確なパスを通して可能である必要があります。
- 強力 — Keras は業界強度の (industry-strength) パフォーマンスとスケーラビリティを提供します: それは NASA, YouTube や Waymo を含む組織により使用されています。
Keras 3 はマルチフレームワークの深層学習 API
マルチフレームワーク API として、Keras はどのフレームワーク — JAX, TensorFlow, or PyTorch とも互換性のあるモジュール式コンポーネントを開発するために使用できます。
このアプローチは幾つかの主要な利点があります :
- モデルについて常に最高のパフォーマンスを得られます。私たちのベンチマークでは、通常は JAX が GPU, TPU と CPU 上で最善の訓練と推論パフォーマンスを提供することを見出しました — しかし 非-XLA TensorFlow が GPU では場合によってはより高速なので結果はモデルにより様々です。コードをまったく変更する必要なくモデルに対して最善のパフォーマンスを提供するバックエンドを動的に選択できる機能は、実現可能な最高の効率性で訓練してサービス提供できることが常に保証されます。
- モデルに対して利用可能なエコシステムの表面 (surface) を最大化します。任意の Keras モデルは PyTorch モジュールとしてインスタンス化できて、TensorFlow SavedModel としてエクスポートできて、またステートレスな JAX 関数としてインスタンス化することもできます。つまり、 Keras モデルを、PyTorch エコシステムパッケージと共に、完全な範囲の TensorFlow の配備 & プロダクションツールと共に、そして JAX 大規模スケール TPU 訓練インフラと共に使用することができます。Keras API を使用して一つの model.py を書けば、ML の世界が提供するすべてのものへのアクセスできます。
- 貴方のオープンソースモデルのリリースについて配布を最大化します。事前訓練済みモデルをリリースしたいですか?できる限り多くの人がそれを利用できることを望みますか?純粋な TensorFlow か PyTorch でそれを実装すれば、マーケットのおおよそ半分により利用可能になります。それを Keras で実装すれば、フレームワークの選択に関係なく誰でも (Keras ユーザでない場合でさえも) すぐに利用可能です。追加の開発コストなしに効果が 2 倍になります。
- 任意のソースからのデータパイプラインの使用。Keras fit()/evaluate()/predict() ルーチンは、使用しているバックエンドとは無関係に、tf.data.Dataset オブジェクト、PyTorch DataLoader オブジェクト、NumPy 配列、Pandas データフレームと互換性があります。Keras + TensorFlow モデルを PyTorch DataLoader で訓練したり、Keras + PyTorch モデルを tf.data.Dataset で訓練することができます。
Keras との最初のコンタクト
Keras の中核のデータ構造は 層 と モデル です。最も単純なタイプのモデルは シーケンシャル・モデル, 層の線形スタックです。より複雑なアーキテクチャについては、Keras 関数型 API を使用する必要があり、これは層の任意のグラフを構築したり、サブクラス化により全くゼロからモデルを作成する ことを可能にします。
ここにシーケンシャル・モデルがあります :
import keras
model = keras.Sequential()
層のスタックは .add() のように簡単です :
from keras import layers
model.add(layers.Dense(units=64, activation='relu'))
model.add(layers.Dense(units=10, activation='softmax'))
モデルが良いようならば、その学習過程を .compile() で configure します :
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
必要であれば、optimizer を更に設定構成できます。Keras の哲学は、単純なことは単純に保持する一方で、必要であるときユーザが完全に制御することを可能にすることです (究極の制御はサブクラス化によるソースコードの容易な拡張性です)。
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.SGD(learning_rate=0.01, momentum=0.9, nesterov=True))
バッチで訓練データを反復できるようになりました :
# x_train and y_train are Numpy arrays
model.fit(x_train, y_train, epochs=5, batch_size=32)
1 行でテスト損失とメトリクスを評価します :
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
あるいは新しいデータで予測を生成します :
classes = model.predict(x_test, batch_size=128)
今しがたご覧になったものは Keras を使用する最も基本的な方法です。
けれども、Keras はまた最先端の研究アイデアを反復するのにも適した高度に柔軟なフレームワークです。Keras は複雑さの段階的な開示の原理に従っています : それは始めることを簡単にしますが、各段階で漸進的な学習だけを必要としながら、任意に進んだユースケースを処理することを可能にします。
上記の単純なニューラルネットワークを数行で訓練して評価できたのと殆ど同じ方法で、Keras を使用して新しい訓練手続きや最先端のモデルアーキテクチャを素早く開発することができます。
ここにカスタム Keras 層のサンプルがあります — これは JAX, TensorFlow や PyTorch の低位ワークフローで互いに交換可能に (interchangeably) 使用できます :
import keras
from keras import ops
class TokenAndPositionEmbedding(keras.Layer):
def __init__(self, max_length, vocab_size, embed_dim):
super().__init__()
self.token_embed = self.add_weight(
shape=(vocab_size, embed_dim),
initializer="random_uniform",
trainable=True,
)
self.position_embed = self.add_weight(
shape=(max_length, embed_dim),
initializer="random_uniform",
trainable=True,
)
def call(self, token_ids):
# Embed positions
length = token_ids.shape[-1]
positions = ops.arange(0, length, dtype="int32")
positions_vectors = ops.take(self.position_embed, positions, axis=0)
# Embed tokens
token_ids = ops.cast(token_ids, dtype="int32")
token_vectors = ops.take(self.token_embed, token_ids, axis=0)
# Sum both
embed = token_vectors + positions_vectors
# Normalize embeddings
power_sum = ops.sum(ops.square(embed), axis=-1, keepdims=True)
return embed / ops.sqrt(ops.maximum(power_sum, 1e-7))
以上