TensorFlowを使用してテキスト判定を行ってみました。
(なんとなくの設定が多いです。またデータもかなり簡易なものです。)
TA13 テキスト分類 検討は二値判定ですが、これをクラス判定に変更しています。
対象: CalculiX、OpenFOAM、Elmerの解析モデルファイル。
学習データ:CalculiX、OpenFOAMのサンプルファイル(インストール時に含まれるもの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
コメント