ArrayFromFP16

ushort türündeki bir diziyi istenilen formatta float veya double türünde bir diziye kopyalar.

bool   ArrayFromFP16(
   const float&         dst_array[],        // hedef dizi
   const ushort&        src_array[],        // kaynak dizi
   ENUM_FLOAT16_FORMAT  fmt                 // format
   );

Double türü için aşırı yükleme

bool   ArrayFromFP16(
   const double&        dst_array[],        // hedef dizi
   const ushort&        src_array[],        // kaynak dizi
   ENUM_FLOAT16_FORMAT  fmt                 // format
   );

Parametreler

dst_array[]

[out]  float veya double türünde alıcı dizi.

src_array[]

[in]  ushort türünde kaynak dizi.

fmt

[in] ENUM_FLOAT16_FORMAT numaralandırmasından kopyalama formatı.

 

Geri dönüş değeri

Başarılı ise true, aksi takdirde false geri döndürür.

Not

FLOAT16 ve BFLOAT16 formatları ENUM_FLOAT16_FORMAT numaralandırmasında tanımlanır ve MQL5'te yalnızca ONNX modelleriyle çalışmalar için kullanılır.

OnnxRun fonksiyonunun yürütülmesinden elde edilen çıktı parametreleri FLOAT16 ve BFLOAT16 türündeyse, sonucu float veya double türünde dizilere dönüştürmek için bu fonksiyonu kullanabilirsiniz.

Half-precision float olarak da bilinen FLOAT16, ondalıklı sayıları temsil etmek için 16 bit kullanır. Bu format, doğruluk ve hesaplama verimliliği arasında bir denge sağlar. FLOAT16, büyük veri kümelerinin yüksek performansla işlenmesini gerektiren derin öğrenme algoritmalarında ve sinir ağlarında yaygın olarak kullanılmaktadır. Bu format, özellikle GPU'larda derin sinir ağlarını eğitirken önemli olan sayıların boyutunu azaltarak hesaplama işlemlerini hızlandırır.

BFLOAT16 (veya brain floating point 16) da 16 bit kullanır ancak format temsiline yaklaşım açısından FLOAT16'dan farklıdır. Bu formatta, 8 bit üssü temsil etmek için ayrılırken, kalan 7 bit mantisi temsil etmek için kullanılır. Bu format, özellikle Google'ın tensör işleme biriminde (Tensor Processing Unit, TPU) olmak üzere derin öğrenme ve yapay zekada kullanılmak üzere geliştirilmiştir. BFLOAT16, sinir ağı eğitiminde mükemmel performans gösterir ve hesaplamaları etkili bir şekilde hızlandırabilir.

Örnek: makaleden fonksiyon - ONNX modelleriyle float16 ve float8 formatlarında çalışma

//+------------------------------------------------------------------+
//| RunCastFloat16ToDouble                                           |
//+------------------------------------------------------------------+
bool RunCastFloat16ToDouble(long model_handle)
  {
   PrintFormat("test=%s",__FUNCTION__);
   double test_data[12]= {1,2,3,4,5,6,7,8,9,10,11,12};
   ushort data_uint16[12];
   if(!ArrayToFP16(data_uint16,test_data,FLOAT_FP16))
     {
      Print("error in ArrayToFP16. error code=",GetLastError());
      return(false);
     }
   Print("test array:");
   ArrayPrint(test_data);
   Print("ArrayToFP16:");
   ArrayPrint(data_uint16);
   U<ushortinput_float16_values[3*4];
   U<doubleoutput_double_values[3*4];
   float test_data_float[];
   if(!ArrayFromFP16(test_data_float,data_uint16,FLOAT_FP16))
     {
      Print("error in ArrayFromFP16. error code=",GetLastError());
      return(false);
     }
   for(int i=0i<12i++)
     {
      input_float16_values[i].value=data_uint16[i];
      PrintFormat("%d input value =%f  Hex float16 = %s  ushort value=%d",i,test_data_float[i],ArrayToString(input_float16_values[i].uc),input_float16_values[i].value);
     }
   Print("ONNX input array:");
   ArrayPrint(input_float16_values);
   bool res=OnnxRun(model_handle,ONNX_NO_CONVERSION,input_float16_values,output_double_values);
   if(!res)
     {
      PrintFormat("error in OnnxRun. error code=%d",GetLastError());
      return(false);
     }
   Print("ONNX output array:");
   ArrayPrint(output_double_values);
//---
   double sum_error=0.0;
   for(int i=0i<12i++)
     {
      double delta=test_data[i]-output_double_values[i].value;
      sum_error+=MathAbs(delta);
      PrintFormat("%d output double %f = %s  difference=%f",i,output_double_values[i].value,ArrayToString(output_double_values[i].uc),delta);
     }
//---
   PrintFormat("test=%s   sum_error=%f",__FUNCTION__,sum_error);
//---
   return(true);
  }

Ayrıca bakınız

ArrayToFP16, ArrayCopy