"MQL5'te ONNX modelleri nasıl kullanılır?" makalesi için tartışma - sayfa 6

 
Model sınıflandırıcı kullanırken hata.

Regresyon her şeyle çalışır, çıktı bir sayıdır.

Ancak herhangi bir sohbetten MLP sınıflandırıcı yazmasını istediğinizde, Uzman Danışman bu modelin çıktı verilerini tanıyamaz: "Al", "Sat", "Tut". Ya "1", "2", "3" ya da "0", "1", "2".

Hata uçuyor

2025.02.12 08:13:46.866 Core 01 2021.01.01 00:00:00 Çıktı formu ayarlanırken hata oluştu: 5808
2025.02.12 08:13:46.866 Core 01 2021.01.01 00:00:00 ONNX: OnnxRelease işlevine geçersiz tanıtıcı aktarıldı, kod 'X È$Zë3E' incelendi (291:7)

Sohbetlerden hiçbiri, Dipsic bile, sorunu anlamıyor veya nasıl çözeceğini bilmiyor, bu hataya yol açan olası kodlar üretiyor.

Tüm sohbetler aynı şeyi söylüyor: bu bir MLP sınıflandırıcı olduğundan, etiketlerinize göre yalnızca 3 çıkışı var (son sütunun basit bir sınıflandırmanın üç etiketinden biri olduğu bir csv dosyası besliyorum: al, sat, tut. Bu sütunda dize ve sayısal değerleri denedim).

Sonra bu blok

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


dizisinin başlatılmasını değiştirir.
const long output_shape[] = {1,3};
   if(!OnnxSetOutputShape(ExtHandle,0,output_shape))
     {
      Print("OnnxSetOutputShape error ",GetLastError());
      return(INIT_FAILED);
     }


Ve bir hata görünüyor.

Yazdırmaya çalışıyorum.

Print(OnnxGetOutputCount(ExtHandle));

2 alıyorum.

Hiçbir şey anlamıyorum.



Hatanın ne olduğunu anlayan varsa, lütfen bana bildirin.

Sınıflandırıcı için Python kodu - herhangi biri, hepsi aynı hatayı üretir.

Örneğin, uygulamalardan biri:

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

# Veri yükleniyor
file_path = '....csv'
data = pd.read_csv(file_path)

# Özniteliklere (X) ve etiketlere (y) bölün
X = data.iloc[:, :160].values  # İlk 160 sütun girdi verileridir
y = data.iloc[:, 160].values   # Son sütun hedef etiketidir

# Dize etiketlerini sayısal etiketlere kodlama
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)

# Veri normalizasyonu
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Eğitim ve test örneklerine bölün
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_encoded, test_size=0.2, random_state=42)

# Bir MLP sınıflandırıcı oluşturma
mlp = MLPClassifier(hidden_layer_sizes=(128, 64), activation='relu', solver='adam', max_iter=500, random_state=42)
mlp.fit(X_train, y_train)

# Modelin doğruluğunun tahmin edilmesi
accuracy = mlp.score(X_test, y_test)
print(f"Accuracy: {accuracy * 100:.2 f}%")

# Modeli ONNX formatında kaydetme
initial_type = [('float_input', FloatTensorType([None, 160]))]  # 160 giriş özelliği
onnx_model = convert_sklearn(mlp, initial_types=initial_type)

# ONNX modelini kaydetme
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}")


Yani, modelin kendisi - python'da çalışıyor. Bir şey hesaplıyor

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

Ama danışman bunu kabul edemez.

[Silindi]  
Sağlıklı bir toplulukta kod üretimi tartışılmaz ve hatta bir tür olarak kabul edilmez. Çoklu sınıfın desteklenmediği ONNX hatası hakkında bilgi sahibi olmak fena değil.
 
Tartışılmasına gerek yok
Soru bu değil.
[Silindi]  
Ivan Butko #:
Tartışılmasına gerek yok
Soru bu değil.

2,3} veya {3}'ü deneyin.

python betiğinden çıktının doğru boyutunu vermesini isteyin.

ancak büyük olasılıkla sadece {1}, alanların zaten çıktılara karşılık geldiği bir yapı döndürür.


Örneğin, ikili bir sınıflandırıcı için sahip olduğum

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

Daha sonra kodda bir yapı oluşturursunuz

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];

Burada etiket alanı sınıf değerlerini, tensör ise olasılıkları göstermektedir

[Silindi]  
Yanlış: label sınıf değerlerini içerir ve tensor olasılıkları içerir. Çıktı boyutu aslında 2,2'dir, ancak yapı döndürüldüğü için 1 olarak ayarlanmalıdır
 
Maxim Dmitrievsky #:
Yanlış: label sınıf değerlerini içerir ve tensor olasılıkları içerir. Yani çıktı boyutu aslında 2,2'dir, ancak yapı döndürüldüğü için 1 koymalısınız
Teşekkürler

UPD

Mimarilerin özü üzerine: makaledeki regresyon, vangülasyon ile ilgilidir. Ve sınıflandırma daha mantıklı görünüyor. Ve işte - yerel işlevsellikte bununla ilgili bir sorun olduğu ortaya çıkıyor.

Öznel olarak: hedef bir sonraki fiyat (veya başka bir nicel gösterge) olarak işaretlenirse, NS bir yandan diğer yana sallanmaya başlar.

Ve hedef al-sat-tut olarak işaretlenmişse, en azından NS, boyuta dikkat etmeden kendini başarılı girişlerin sayısına göre ayarlar. Ve mesafe konusunda bu "cehalet", gürültü terapisi gibi bir miktar dengeleme ile telafi edilir. Imho, elbette, sınıflandırmayı başka bir uygulamada çok az denedi. Bu yüzden burada
[Silindi]  
Ivan Butko #:
Teşekkür ederim.
Ayrıca ağınızı Netron aracılığıyla görselleştirebilirsiniz ve boyut ve çıktı türünü görüntüleyecektir
[Silindi]  
Ivan Butko #:
Teşekkürler

UPD

Mimarilerle ilgili olarak: makaledeki regresyon vangülasyon ile ilgilidir. Ve sınıflandırma daha mantıklı görünüyor. Ve işte buradayız - yerel işlevsellikte bununla ilgili bir sorun olduğu ortaya çıkıyor.

Öznel olarak: Hedef bir sonraki fiyat (veya başka bir niceliksel gösterge) olarak işaretlenirse, NS bir yandan diğer yana sallanmaya başlar.

Ve hedef al-sat-tut olarak işaretlenmişse, en azından NS, boyuta dikkat etmeden başarılı girişlerin sayısına göre ayarlanır. Ve mesafe üzerinde bu "cehalet", sanki gürültü terapisi gibi bir miktar dengeleme ile telafi edilir. Imho, elbette, sınıflandırmayı başka bir uygulamada çok az denedi. Bu yüzden burada

Saygı duymadığınız ön işleme bunun içindir :) önce taneleri samandan ayırmak ve sonra ayrılan taneleri tahmin etmek için eğitmek.

Ön işleme iyiyse, çıktı da tam olarak çöp değildir

 

Bu betiği python'un daha yeni sürümleriyle (3.10-3.12) çalışacak şekilde düzeltme şansınız var mı?

3.9'da çalıştırmaya çalışırken bir sürü sorun yaşıyorum.

tx