この投稿では、fasttext テキスト分類子の操作について説明します。
ファーストテキスト –テキスト分類のための機械学習ライブラリ。彼女に曲のタイトルでメタルバンドを見分けるように教えてみましょう。これを行うために、データセットを使用した教師あり学習を使用します。
グループ名を付けた曲のデータセットを作成しましょう:
__label__metallica fuel
__label__metallica escape
__label__black_sabbath gypsy
__label__black_sabbath snowblind
__label__black_sabbath am i going insane
__label__anthrax anthrax
__label__anthrax i'm alive
__label__anthrax antisocial
[и т.д.]
Формат обучающей выборки:
Обучим fasttext и сохраним модель:
model.save_model("model.bin")
トレーニングされたモデルをロードし、曲の名前でグループを識別するように要求します。
predictResult = model.predict("Bleed")
print(predictResult)
В результате мы получим список классов на которые похож данный пример, с указанием уровня похожести цифрой, в нашем случае похожесть названия песни Bleed на одну из групп датасета.
Для того чтобы модель fasttext умела работать с датасетом выходящим за границы обучающей выборки, используют режим autotune с использованием файла валидации (файл тест). Во время автотюна fasttext подбирает оптимальные гиперпараметры модели, проводя валидацию результата на выборке из тест файла. Время автотюна ограничивается пользователем в самостоятельно, с помощью передачи аргумента autotuneDuration.
Пример создания модели с использованием файла тест:
Источники
https://fasttext.cc
https://gosha20777.github.io/tutorial/2018/04/12/fasttext-for-windows
Исходный код
https://gitlab.com/demensdeum/MachineLearning/-/tree/master/6bandClassifier
単純な TensorFlow の例
ここでは、ディープ ラーニングを使用するためのフレームワークを使用する簡単な例を紹介します。テンソルフロー。この例では、ニューラル ネットワークに正、負の数、およびゼロを検出するよう教えます。 TensorFlow と CUDA 教えておきますが、このタスクは実際には簡単ではありません)
分類問題を解決するには、分類子。 TensorFlow には、最小限の構成で動作する既製の高レベル分類器がいくつかあります。まず、DNNClassifier をトレーニングします。正、負の数値、ゼロを含むデータセット正しい「ラベル」を付けてください。人間のレベルでは、データセットは分類結果 (ラベル) を含む一連の数値です。
10 –ポジティブ
-22 –ネガティブ
0 –ゼロ
42 –ポジティブ
な…分類のあるその他の番号
次に、トレーニングが開始され、その後、データセットにも含まれていない数値を入力できるようになります。ニューラル ネットワークはそれらを正しく識別する必要があります。
以下は、トレーニングおよび入力データ用のデータセット ジェネレーターを備えた分類子の完全なコードです。
インポート テンソルフローインポート itertoolsインポートランダムから時刻 インポート時間クラス 分類番号:__number = 0__classifiedAs = 3def __init__(自分、番号):自分.__number =スパン>数値if 数値 == 0:self.__classifiedAs =スパン> <スパン スタイル="カラー: #0000dd; font-weight: ボールド;">0 <スパン スタイル="カラー: #888888;">#ゼロエリフ 番号 > 0:self.__classifiedAs =スパン> <スパン スタイル="カラー: #0000dd; font-weight: ボールド;">1 <スパン スタイル="カラー: #888888;">#ポジティブスパン>エリフ 番号 < 0:self.__classifiedAs =スパン> <スパン スタイル="カラー: #0000dd; font-weight: ボールド;">2 <スパン スタイル="カラー: #888888;">#否定的def 数値(自分):戻る 自分自身.__番号def classifiedAs(自分):戻る 自分自身.__classifiedAsdef classifiedAsString(classifiedAs):if として分類== 0:return 「ゼロ」elif が == として分類されました 1:return 「ポジティブ」elif が == として分類されました 2:return "Negative"def trainDatasetFunction():trainNumbers = []trainNumberLabels = []私は中 範囲(-1000、1001):数値 = ClassifiedNumber(i)trainNumbers.append(number.number())trainNumberLabels.append(number.classifiedAs())return ( {"number" : trainNumbers } , trainNumberLabels)def inputDatasetFunction():グローバル ランダムシードrandom.seed(randomSeed) # 同じ結果を得る数字= []私は中 範囲(0, 4):数値.append(random.randint(-9999999、9999999))return {"number" : 数値 }def メイン():print("TensorFlow 正負ゼロ数値分類子テスト (demensdeum 2017 による) (demensdeum@gmail. com)")maximalClassesCount = len(set< /span>(trainDatasetFunction()[1])) + 1numberFeature = tensorflow.feature_column。 numeric_column("数値")分類子= tensorflow.推定子。 DNNClassifier(feature_columns = [numberFeature], hidden_units = [10、20、10]、n_classes = maximalClassesCount)ジェネレーター= 分類子.train(input_fn = trainDatasetFunction、ステップ = 1000).predict(input_fn = inputDatasetFunction)inputDataset = inputDatasetFunction()結果 = リスト(itertools)。 islice(generator, len(inputDatasetFunction()["数値"])))i = 0結果の結果:print("番号: %d は %s として分類されました" % (inputDataset["number"][i], generatedAsString(result["class_ids"][0 ])))i += 1ランダムシード = time()主要()
すべては main() メソッドで始まり、分類子が機能する数値列を設定します – tensorflow.feature_column.numeric_column(“number”) 次に、分類子のパラメーターを設定します。 API は毎日変更されるため、現在の初期化引数を説明することは役に立ちません。古いマニュアルに依存せず、インストールされているバージョンの TensorFlow のドキュメントを必ず参照する必要があります。
次に、正、負、またはゼロに基づいてこれらの数値を正しく分類して、-1000 から 1000 までの数値のデータセットを返す関数 (trainDatasetFunction) を示すトレーニングが開始されます。次に、トレーニング データセットに含まれていない数値を入力として送信します。 -9999999 から 9999999 までのランダム (inputDatasetFunction) を使用して分類します。
最後に、入力データ (itertools.islice) の数に基づいて反復を開始し、結果を出力して実行すると、驚くべき結果が得られます。
番号: 4063470 は陽性として分類されました番号: 6006715 陽性として分類番号: -5367127 は陰性として分類されました番号: -7834276 陰性として分類
正直に言うと、私が教えていない数値さえも分類子が「理解」していることに今でも少し驚いています。将来的には、機械学習のトピックをより詳細に理解できるようになり、より多くのチュートリアルが提供されることを願っています。
GitLab:
https://gitlab.com/demensdeum/MachineLearning
リンク:
https://developers.googleblog.com/2017/09/introducing-tensorflow-datasets.html
https://www.tensorflow.org/versions/master/api_docs/python/tf/estimator/DNNClassifier