夕湖津のブログ -3ページ目

夕湖津のブログ

問題解決に役立つ情報の提供を目指します

■事象

url = "ここに解析対象URL"

client = ここにクライアント定義コード

 

poller = client.begin_analyze_document_from_url(
            model_id = "prebuilt-read",
            document_url = url,
     )

 

上記コード実行で下記エラー(どんなURLでもそうなる場合は、当記事が参考になるはずです)

 

 (InvalidRequest) Invalid request.
 Code: InvalidRequest
 Message: Invalid request.
 Inner error: {
     "code": "InvalidContent",
     "message": "The file is corrupted or format is unsupported. Refer to documentation for the list of supported formats."
}

 

■原因(の一つ)

azure-ai-document-intelligenceのバージョンが3.3未満の可能性あり

 

■対応

$ pip show azure-ai-formrecognizer

で現在のバージョンを確認し、3.2以下でしたら、下記で最新にして下さい。

 

$ pip install -U azure-ai-formrecognizer

:

:

$ pip show azure-ai-formrecognizer
Name: azure-ai-formrecognizer
Version: 3.3.2
Summary: Microsoft Azure Form Recognizer Client Library for Python
Home-page: https://github.com/Azure/azure-sdk-for-python
Author: Microsoft Corporation
Author-email: azpysdkhelp@microsoft.com
License: MIT License
Location: /home/hoge/miniconda3/lib/python3.11/site-packages
Requires: azure-common, azure-core, msrest, typing-extensions
Required-by: 

 

これでうまくいくはずです。

再度400エラーになったら、clientの設定(endpointやcredentialミスなど)を次に疑って下さい。

 

 

 

 

■事象

from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient

endpoint = os.environ["ENDPOINT"]
key = os.environ["API_KEY"]

client = DocumentIntelligenceClient(endpoint=endpoint, credential=AzureKeyCredential(key))
with open(path_to_sample_documents, "rb") as f:
    poller = client.begin_analyze_document("prebuilt-read", f, content_type="application/octet-stream")

 

上記コードを実行すると下記エラーが出る

(404) Resource not found


■解決方法

恐らく、リージョンが東日本になっているので、下記ドキュメントのようにリージョンを米国東部などにして再作成する

 

【ドキュメント】

パブリック プレビュー バージョン 2023-10-31-preview は、現在、次の Azure リージョンでのみ使用できます。

米国東部
米国西部 2
西ヨーロッパ

 

 

■事象

viewすると下記が表示される

 

$ view hoge

E1187: Failed to source defaults.vim
Press ENTER or type command to continue
 

■解決方法

$ mkdir ~/.vim

$ touch ~/.vim/vimrc

 

■原因

$ vi --version

   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"

 

上記のように、vi関連設定ファイルを探しにいって、$HOME/.vimrcなど見つからずに、

最後の「defaults file: "$VIMRUNTIME/defaults.vim"」に行き着いて、結局ないため、

「E1187: Failed to source defaults.vim」と表示される。

気がします。

 

■コード

1.パラメータ

LR = 0.001
lightgbm_params = {
    "boosting_type": "dart", #gbdt or dart(こちらの方が汎化性能が良いケースが多い)
    "learning_rate": LR,
    "objective": "multiclass",
    "num_class": 3,
    "metric": "multi_logloss",  #multi_error/multi_logloss
    "verbosity": 1,
    # GPU使用
    "device": 'gpu',
    'gpu_platform_id': 1,
    'gpu_device_id': 1,    # GPUがNVIDIA でない時はこの数字を0 or 1に変更する

 

2.学習コード

import time

from sklearn.metrics import f1_score

import lightgbm as lgb

from sklearn.model_selection import KFold, StratifiedKFold

from tqdm import tqdm

 

valid_scores = []
models = []

SEED=42
FOLD=5

 

feature_list = ここで特徴量列のリスト定義

 

kf = KFold(n_splits=FOLD, shuffle=True, random_state=SEED)
skf = StratifiedKFold(n_splits=FOLD, shuffle=True, random_state=SEED)

 

# for fold, (tr_idx, va_idx) in tqdm(enumerate(kf.split(train_df))):
for fold, (tr_idx, va_idx) in tqdm(enumerate(skf.split(train_df[feature_list], train_df['target']))):
    print(f"=========={fold+1}FOLD目=======================")
    #時間計測開始
    time_start = time.perf_counter()
    print('経過時間測定開始')
 
    evals_result = {}
    
    X_tr = train_df[feature_list].iloc[tr_idx]
    X_va = train_df[feature_list].iloc[va_idx]
    y_tr = train_df['target'].iloc[tr_idx]
    y_va = train_df['target'].iloc[va_idx]
    
    # クラスの重み付けを設定(不均衡データの場合に使用)
    class_weights = {0: 2, 1: 3, 2: 6} 

    lgb_train = lgb.Dataset(X_tr, y_tr, weight=y_tr.map(class_weights))
    lgb_eval  = lgb.Dataset(X_va, y_va, reference=lgb_train)
    
    #繰り返し回数
    NUM_BOOST_ROUND = 2000
    
    model = lgb.train(
        lightgbm_params,
        lgb_train,
        num_boost_round=NUM_BOOST_ROUND,
        valid_sets  = [lgb_train, lgb_eval],
        valid_names = ['train', 'valid'],
        callbacks = [
            lgb.early_stopping(10),  #EarlyStopping基準
            lgb.log_evaluation(50),  #評価表示インタバル
            lgb.record_evaluation(evals_result),
        ]
    )
    
    y_va_pred = model.predict(X_va, num_iteration=model.best_iteration)

    #f1_score(macro)の場合
    score = f1_score(y_va, np.argmax(y_va_pred, axis=-1), average='macro')
    print(f'fold {fold+1} Validation F1 Score (Macro): {score:.3f}')
    print('')
    
    #学習過程プロット
    lgb.plot_metric(evals_result)
    
    # スコア、モデル、予測値の格納
    valid_scores.append(score)
    models.append(model)
    
    # 時間計測終了
    time_end = time.perf_counter()
    print('経過時間測定終了')
    tim = time_end-time_start
    print('経過時間(分):', round(tim/60))
          
print('===========End===================================')

■やりたいこと

下記のようにIMAGE_IDが重複している場合、イメージを両方削除したい

 

■結論

rmに-fオプションを付ける

 

■実際の結果

C:\Users\hoge>docker image ls

REPOSITORY            TAG             IMAGE ID       CREATED         SIZE
httpd                        latest          a6ca7b52a415   10 days ago     168MB
hoge/20231202         1               a6ca7b52a415   10 days ago     168MB

 

上記を消す

 

C:\Users\hoge>docker image rm a6ca7b52a415
Error response from daemon: conflict: unable to delete a6ca7b52a415 (must be forced) - image is referenced in multiple repositories

 

IMAGE_IDが衝突して削除出来ない

 

-fオプションを付ける

 

C:\Users\hoge>docker image rm -f a6ca7b52a415
Untagged: httpd:latest
Untagged: httpd@sha256:04551bc91cc03314eaab20d23609339aebe2ae694fc2e337d0afad429ec22c5a
Untagged: hoge/20231202:1
Untagged: hoge/20231202@sha256:42ed559bb8529283236b537155e345b47051ed082200c7d7e155405b3e169235
Deleted: sha256:a6ca7b52a41549f13f7de6aeac4ab6ffebd41585fbf2273f00fd6e82bb721949

 

■結論

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
os.environ["TF_ENABLE_ONEDNN_OPTS"] = "1"  #これはCPUパフォーマンス最適化用なので任意

 

■経緯

kerasで簡単な学習をさせる時に、カーネルがすぐに逝くので、

バッチサイズを減らしてみましたがだめ。

GPUを大量使用していることが分かったので、

CPUのみ使用する方法でうまくいきました。

 

※kerasのバージョンは、2.10.0

■結論

DBMS_LOB.SUBSTR(カラム名, 4000, 1)

 

例)

SELECT DBMS_LOB.SUBSTR(カラム名, 4000, 1)

FROM hoge;

 

■引数の意味

1文字目から4000文字を抽出

笑わない数学の放映を見て、コラッツ予想を考察してみました。

 

■コラッツ予想の予想

2のn乗に必ず収束することを証明すれば良い

【理由】

2のn乗に到達⇒ その後は「2で割る」ことが連続するので、必ず1に収束する

 

■考察

①Pythonで1~100までの1への収束状況をグラフ化

(1) 収束まで多く回数を要する場合、グラフはほぼ同じだった

(2) 収束まで少ない回数の場合でも、多い場合でもグラフの後半はほぼ同じ

※下記は54~57の場合。

 

 

②奇数の次は必ず偶数なので、永遠に上がり続ける状況はない

③かならず1に収束するということは、偶数が連続するようになっているはず