記事「MQL5でONNXモデルを使用する方法」についてのディスカッション - ページ 6 123456 新しいコメント Ivan Butko 2025.02.12 05:38 #51 回帰はすべてで動作し、出力は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しかし、アドバイザーはそれを受け入れることができない。 削除済み 2025.02.12 09:47 #52 健全なコミュニティでは、コード生成について議論したり、親切だと考えたりすることはない。マルチクラスがサポートされていないONNXのバグについて知っておくことは悪くない。 Ivan Butko 2025.02.12 10:19 #53 議論する必要はない問題ではない 削除済み 2025.02.12 10:33 #54 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); } 削除済み 2025.02.12 11:04 #55 そして、コードの中で構造体を作るだけだ。 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]; ここで、ラベルフィールドはクラスの値で、テンソルは確率です。 削除済み 2025.02.12 11:25 #56 ラベルはクラス値を含み、テンソルは確率を含む。出力次元は本来2,2だが、構造体が返されるので1に設定されるべきである。 Ivan Butko 2025.02.12 11:29 #57 Maxim Dmitrievsky #: ラベルはクラス値を含み、テンソルは確率を含む。したがって、出力次元は本来2,2ですが、構造体が返されるので、1を置くべきです。 ありがとうUPDアーキテクチャの本質について:この記事の回帰はバングレーションを扱っています。そして、分類はより理にかなっているようです。そして驚いたことに、ネイティブの機能ではそれが問題であることが判明しました。主観的には、ターゲットが次の価格(または他の定量的表示)としてマークされている場合、NSは左右に揺れ始める。また、ターゲットがバイ・セル・ホールドとマークされている場合、少なくとも、NSはサイズに注意を払うことなく、成功したエントリーの数に自分自身を調整する。そして、この "無知 "は距離にノイズ療法のように、いくつかの平準化によって補正されます。もちろん、少しは別の実装で分類を試してみました。だから私はここにしたかった 削除済み 2025.02.12 11:30 #58 Ivan Butko #: ありがとうございました。 ネットロンを使ってメッシュを可視化することもできます。 削除済み 2025.02.12 11:46 #59 Ivan Butko #: ありがとう アップデイト アーキテクチャーについての指摘:この記事の回帰はバンジュレーションを扱っている。そして、分類はより理にかなっているようだ。そして、私たちはここにいる。それは、ネイティブの機能における問題であることが判明した。 主観的に:ターゲットが次の価格(または他の定量的な表示)としてマークされている場合、NSは左右に揺れ始める。 また、ターゲットが買い・売り・ホールドとマークされている場合、少なくとも、NSはサイズに注意を払うことなく、成功したエントリーの数に合わせる。そして、距離にこの "無知 "は、ノイズセラピーのように、いくつかの平準化によって補正されます。もちろん、少しは別の実装で分類を試してみました。だから私はここにしたかった それは、あなたが尊重しない前処理は、そのためにあるのです :) 籾殻から穀粒を最初に分離し、分離された穀粒を予測するためにそれを訓練する。 前処理がうまくいけば、出力もゴミのようなものにはならない。 Andreas Alois Aigner 2025.04.07 12:38 #60 このスクリプトを新しいバージョンのpython(3.10-3.12)で実行できるように修正できる可能性はありますか? 3.9で実行させようとすると問題が山積みです。 tx 123456 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
しかし、任意のチャットに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 ONNX: OnnxRelease関数に渡されたハンドルが無効、コード「X È$Zë3E」を検査 (291:7)
どのチャットも、Dipsicでさえも、この問題の解決方法を理解しておらず、このエラーにつながる可能性のあるコードも生成していません。
どのチャットも同じことを言っています。これはMLP分類器なので、ラベルに従って3つの出力しかありません(私はcsvファイルを与えており、最後の列は単純な分類の3つのラベルのうちの1つです:買い、売り、ホールド)。この列には文字列と数値を入れました)。
次に、このブロック
。 配列
の初期化を 変更する。
そしてエラーが表示される。
印刷しようとしている。
何も理解できない。
エラーの意味がわかる人がいたら教えてほしい。
分類器のPythonコード - どれも、同じエラーを生成する。
たとえば、ある実装:
つまり、モデルそのものがpythonで実行されています。何かを計算している
しかし、アドバイザーはそれを受け入れることができない。
議論する必要はない
2,3}か{3}を試してください。
pythonスクリプトに出力の正しい次元を出力するように頼んでください。
しかし、ほとんどの場合{1}だけで、フィールドがすでに出力に対応する構造体を返します。
例えば、バイナリ分類器は
そして、コードの中で構造体を作るだけだ。
ここで、ラベルフィールドはクラスの値で、テンソルは確率です。
ラベルはクラス値を含み、テンソルは確率を含む。したがって、出力次元は本来2,2ですが、構造体が返されるので、1を置くべきです。
ありがとうございました。
ありがとう
それは、あなたが尊重しない前処理は、そのためにあるのです :) 籾殻から穀粒を最初に分離し、分離された穀粒を予測するためにそれを訓練する。
前処理がうまくいけば、出力もゴミのようなものにはならない。
このスクリプトを新しいバージョンのpython(3.10-3.12)で実行できるように修正できる可能性はありますか?
3.9で実行させようとすると問題が山積みです。
tx