記事「MQL5でONNXモデルを使用する方法」についてのディスカッション - ページ 6

 
回帰はすべてで動作し、出力は1つの数字です。

しかし、任意のチャットにMLP-classifierを書かせると、Expert Advisorはこのモデルの出力データを認識できません: "Buy"、 "Sell"、 "Hold"。1", "2", "3 "か、"0", "1", "2 "のどちらかである。

エラーが飛ぶ

2025.02.12 08:13:46.866 Core 01 2021.01.01 00:00:00 出力形式の設定エラー: 5808
2025.02.12 08:13:46.866 Core 01 2021.01.01 00:00:00 ONNX: OnnxRelease関数に渡されたハンドルが無効、コード「X È$Zë3E」を検査 (291:7)

どのチャットも、Dipsicでさえも、この問題の解決方法を理解しておらず、このエラーにつながる可能性のあるコードも生成していません。

どのチャットも同じことを言っています。これはMLP分類器なので、ラベルに従って3つの出力しかありません(私はcsvファイルを与えており、最後の列は単純な分類の3つのラベルのうちの1つです:買い、売り、ホールド)。この列には文字列と数値を入れました)。

次に、このブロック

const long output_shape[] = {1,1};
   if(!OnnxSetOutputShape(ExtHandle,0,output_shape))
     {
      Print("OnnxSetOutputShape error ",GetLastError());
      return(INIT_FAILED);
     }
配列

の初期化を 変更する。
const long output_shape[] = {1,3};
   if(!OnnxSetOutputShape(ExtHandle,0,output_shape))
     {
      Print("OnnxSetOutputShape error ",GetLastError());
      return(INIT_FAILED);
     }


そしてエラーが表示される。

印刷しようとしている。

Print(OnnxGetOutputCount(ExtHandle));



何も理解できない。



エラーの意味がわかる人がいたら教えてほしい。

分類器のPythonコード - どれも、同じエラーを生成する。

たとえば、ある実装:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.neural_network import MLPClassifier
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

# データの読み込み
file_path = '....csv'
data = pd.read_csv(file_path)

# 属性(X)とラベル(Y)に分割
X = data.iloc[:, :160].values  # 最初の160列は入力データ
y = data.iloc[:, 160].values   # 最後の列はターゲットラベル

# 文字列ラベルを数値ラベルにエンコードする
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)

# データの正規化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# トレーニングサンプルとテストサンプルに分ける
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_encoded, test_size=0.2, random_state=42)

# MLP分類器を作成する
mlp = MLPClassifier(hidden_layer_sizes=(128, 64), activation='relu', solver='adam', max_iter=500, random_state=42)
mlp.fit(X_train, y_train)

# モデルの精度を見積もる
accuracy = mlp.score(X_test, y_test)
print(f"Accuracy: {accuracy * 100:.2 f}%")

# モデルをONNX形式で保存
initial_type = [('float_input', FloatTensorType([None, 160]))]  # 160の入力機能
onnx_model = convert_sklearn(mlp, initial_types=initial_type)

# ONNXモデルの保存
onnx_file_path = 'model.onnx'
with open(onnx_file_path, "wb") as f:
    f.write(onnx_model.SerializeToString())

print(f"Model saved as {onnx_file_path}")


つまり、モデルそのものがpythonで実行されています。何かを計算している

runfile('....py', wdir='...')
Accuracy: 54.16%
Model saved as model.onnx

しかし、アドバイザーはそれを受け入れることができない。

削除済み  
健全なコミュニティでは、コード生成について議論したり、親切だと考えたりすることはない。マルチクラスがサポートされていないONNXのバグについて知っておくことは悪くない。
 
議論する必要はない
問題ではない
削除済み  
Ivan Butko #:
議論する必要はない
問題ではない

2,3}か{3}を試してください。

pythonスクリプトに出力の正しい次元を出力するように頼んでください。

しかし、ほとんどの場合{1}だけで、フィールドがすでに出力に対応する構造体を返します。


例えば、バイナリ分類器は

const long output_shape[] = {1};
   if(!OnnxSetOutputShape(ExtHandle, 0, output_shape))
     {
      Print("OnnxSetOutputShape 1 error ", GetLastError());
      return(INIT_FAILED);
     }
削除済み  

そして、コードの中で構造体を作るだけだ。

static vector out(1);

   struct output
     {
      long           label[];
      float          tensor[];
     };

   output out2[];
   
   OnnxRun(ExtHandle, ONNX_DEBUG_LOGS, f, out, out2);

   double sig = out2[0].tensor[1];

ここで、ラベルフィールドはクラスの値で、テンソルは確率です。

削除済み  
ラベルはクラス値を含み、テンソルは確率を含む。出力次元は本来2,2だが、構造体が返されるので1に設定されるべきである。
 
Maxim Dmitrievsky #:
ラベルはクラス値を含み、テンソルは確率を含む。したがって、出力次元は本来2,2ですが、構造体が返されるので、1を置くべきです。
ありがとう

UPD

アーキテクチャの本質について:この記事の回帰はバングレーションを扱っています。そして、分類はより理にかなっているようです。そして驚いたことに、ネイティブの機能ではそれが問題であることが判明しました。

主観的には、ターゲットが次の価格(または他の定量的表示)としてマークされている場合、NSは左右に揺れ始める。

また、ターゲットがバイ・セル・ホールドとマークされている場合、少なくとも、NSはサイズに注意を払うことなく、成功したエントリーの数に自分自身を調整する。そして、この "無知 "は距離にノイズ療法のように、いくつかの平準化によって補正されます。もちろん、少しは別の実装で分類を試してみました。だから私はここにしたかった
削除済み  
Ivan Butko #:
ありがとうございました。
ネットロンを使ってメッシュを可視化することもできます。
削除済み  
Ivan Butko #:
ありがとう

アップデイト

アーキテクチャーについての指摘:この記事の回帰はバンジュレーションを扱っている。そして、分類はより理にかなっているようだ。そして、私たちはここにいる。それは、ネイティブの機能における問題であることが判明した。

主観的に:ターゲットが次の価格(または他の定量的な表示)としてマークされている場合、NSは左右に揺れ始める。

また、ターゲットが買い・売り・ホールドとマークされている場合、少なくとも、NSはサイズに注意を払うことなく、成功したエントリーの数に合わせる。そして、距離にこの "無知 "は、ノイズセラピーのように、いくつかの平準化によって補正されます。もちろん、少しは別の実装で分類を試してみました。だから私はここにしたかった

それは、あなたが尊重しない前処理は、そのためにあるのです :) 籾殻から穀粒を最初に分離し、分離された穀粒を予測するためにそれを訓練する。

前処理がうまくいけば、出力もゴミのようなものにはならない。

 

このスクリプトを新しいバージョンのpython(3.10-3.12)で実行できるように修正できる可能性はありますか?

3.9で実行させようとすると問題が山積みです。

tx