TensorFlow

TA14 テキスト推定 クラス分類 検討

この記事は約5分で読めます。

TensorFlowを使用してテキスト判定を行ってみました。
(なんとなくの設定が多いです。またデータもかなり簡易なものです。)

TA13 テキスト分類 検討は二値判定ですが、これをクラス判定に変更しています。

対象: CalculiX、OpenFOAM、Elmerの解析モデルファイル。

学習データCalculiXOpenFOAMのサンプルファイル(インストール時に含まれるものTA13と同じ)
Elmerについては作成したもので、case.sifを対象にしています。

学習モデル作成: TensorFlow 2.9.0

深層学習ライブラリ: keras 2.9.0

判定対象データ:CalculiX、OpenFOAM、Elmerのサンプルファイル(上記の一部)

条件: Elmerについては以下のファイル(case.sif)を推定します。CCXとOpenFoamはTA13のもの。

カルマン渦
カルマン渦の例

結果

CCXファイル

check\beam_bar_r1.inp
[0.8699927  0.20512283 0.4339205 ]

OpenFoamファイル

check\A711_2_sample\system\controlDict
[0.52884686 0.09143988 0.9123913 ]

Elmerファイル

check\case.sif.txt
[0.43172762 0.8019181  0.32272348]

クラス数が3つなので、3つの判定値が出力されます。
出力配列のインデックスを1,2,3とすると1はCCX,2はElmer,3はOpenFoamが該当します。
一応、判定はできているようです。
ElmerとOpenFoamはファイルの種類が複数あり、Elmerについてはcase.sifしか対象にしていません。
またElmerは学習用のファイルが極端に少ないです。(用意できてません)

設定

項目設定内容
学習データ数CCX 964枚
OprnFoam 1665枚
Elmer 106枚
仮想データ
バッチサイズ32
エポック数10

作業

ベースファイルの「ipynb」に合わせてJupyter notebook形式で作業します。

TA13からの変更箇所は以下になります。
この内容は、ベースとしているtensorFlowの「映画レビューのテキスト分類」の下段に説明があります。
https://www.tensorflow.org/tutorials/keras/text_classification?hl=jahttps://www.tensorflow.org/tutorials/keras/text_classification?hl=ja

参照するフォルダまたはファイルのパスは適宜変更します。

#Dense(3)に
model = tf.keras.Sequential([
  layers.Embedding(max_features + 1, embedding_dim),
  layers.Dropout(0.2),
  layers.GlobalAveragePooling1D(),
  layers.Dropout(0.2),
  layers.Dense(3)])

model.summary()
#BinaryCrossentropyからSparseCategoricalCrossentropyへ
model.compile(loss=losses.SparseCategoricalCrossentropy(from_logits=True),
              optimizer='adam',
              metrics=['accuracy'])
#accuracy、val_accuracyに
acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
loss = history_dict['loss']
val_loss = history_dict['val_loss']

epochs = range(1, len(acc) + 1)

# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
# b is for "solid blue line"
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()
#BinaryCrossentropyからSparseCategoricalCrossentropyへ
export_model = tf.keras.Sequential([
  vectorize_layer,
  model,
  layers.Activation('sigmoid')
])

export_model.compile(
    loss=losses.SparseCategoricalCrossentropy(from_logits=False), optimizer="adam", metrics=['accuracy']
)

# Test it with `raw_test_ds`, which yields raw strings
loss, accuracy = export_model.evaluate(raw_test_ds)
print(accuracy)

サンプルファイルTA14_text_classification.ipynb

コメント

Translate »
タイトルとURLをコピーしました