FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 18:49Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
НейроСеть neuralnetwork
ntvgjhfnjДата: Понедельник, 05.12.2022, 10:56 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 61
Репутация: 1
Статус: Offline
Начал изучать нейросети. Примеров на FreeBasic не нашёл, у кого есть хоть прототип выложите, а?

Наваял свой пример:

Код

/'
  Sinaps.bi
'/

#Undef NULL
#Define NULL CPtr(Any Ptr, 0)

#Undef Each
#Macro Each(__iter__, __arr__)
__index As Integer = LBound(__arr__) To UBound(__arr__)
#Define __iter__ (__arr__(__index))
#EndMacro
#Define In ,

#Undef MAX
#define MAX(a, b) IIf((a) > (b), (a), (b))
#Undef range
#define range(f,l) (Rnd*((l)-(f))+(f))

#Define len8(value__) Left(Str(value__),8)

#Define f(x) 1 / (1 + Exp(-(x)))

Function foi OverLoad( value_ As Double) As Double
    Return 1/(1 + Exp( -value_))
End Function

Function foi OverLoad( value_ As Double, ves_ As Double, offset_ As Double = 0) As Double
    Return 1/(1 + Exp(  -(value_ * ( ves_ + offset_))))
End Function

Function relu OverLoad( value_ As Double) As Double
    Return max(value_, 0)
End Function

'==========
'  Sinaps
'==========

Type Sinaps  ' weights âåñà,  weight âåñ
    Public:
    Declare Constructor()
    Declare Constructor( value_ As Double = 0)

    Declare Property value( value_ As Double)
    Declare Property value() As Double

    Declare Sub parents( value_() As Sinaps)
    Declare Sub child( value_ As Sinaps)
    Declare Sub predict( input_values_() As Sinaps, weight_values_() As Sinaps, add_weight_values_() As Sinaps)
    Declare Sub printAll()

    next_ As Sinaps Ptr
    prev_(Any) As Sinaps Ptr
    Private:
    As Double value_
End Type

Sub Sinaps.parents( value_() As Sinaps)
    ReDim prev_( UBound( value_)) As Sinaps Ptr

    For i As Integer = 0 To UBound(value_)
  this.prev_(i) = @value_(i)
    Next
End Sub

Sub Sinaps.child( value_ As Sinaps)
    If @value_ = null  Then next_ = null Else next_ = @value_
End Sub

Constructor Sinaps()
    next_ = null
    ReDim prev_(0) As Sinaps Ptr
    value_ = 0.0
End Constructor

Constructor Sinaps( value_ As Double = 0)
    next_ = null
    ReDim prev_(0) As Sinaps Ptr
    this.value_ = value_
End Constructor

Property Sinaps.value( value_ As Double)
this.value_ = value_
End Property

Property Sinaps.value() As Double
Return value_
End Property

Sub Sinaps.predict( input_values_() As Sinaps, weight_values_() As Sinaps, add_weight_values_() As Sinaps)
    For i As Integer = 0 To UBound( input_values_)
  'weight_values_(i).value = range(0, 1)
  this.value = this.value + ( input_values_(i).value *  weight_values_(i).value + add_weight_values_(i).value)

  this.parents( input_values_())
  input_values_(i).child( This)
    Next
End Sub

Sub Sinaps.printAll()
    ? "Value = ";value
    ? "Child = ";@next_
    For i As Integer = 0 To UBound( prev_)
  ? "Parent = ";@prev_(i);" [ Value = "; len8(prev_(i)->value) ;" ]"
    Next
End Sub

Sub relu OverLoad( values_() As Sinaps)
    For i As Integer = 0 To UBound( values_)
  values_(i).value = max(values_(i).value, 0)
    Next
End Sub

Sub f01( values_() As Sinaps)
    For i As Integer = 0 To UBound( values_)
  values_(i).value = f(values_(i).value)
    Next
End Sub

Sub set_random( values_() As Sinaps)
    For i As Integer = 0 To UBound( values_)
  values_(i).value = range(0, 1)
    Next
End Sub

Function argMax( value_() As Sinaps) As Integer
    Var pred_class = 0.0
    Var k = 0

    For i As Integer = 0 To UBound( value_)
  If value_(i).value > pred_class Then
   pred_class = value_(i).value
   k = i
  EndIf
    Next
    Return k
End Function

'''
'/'
#Define MAX_EVOLUTION 3

#Define UNPUT_DIM 4
#Define Hide_DIM 4
#Define Out_DIM 3

Dim As Sinaps x( UNPUT_DIM - 1) = { .21, .5, 1.45, -1} ' input layer

Dim As Sinaps w1( UNPUT_DIM - 1) ' weigth layer
set_random( w1())
Dim As Sinaps b1( UNPUT_DIM - 1) 'weigth+ layer

Dim As Sinaps h( Hide_DIM - 1) ' init layer
Dim As Sinaps w2( Hide_DIM - 1) ' weigth layer
set_random( w2())
Dim As Sinaps b2( Hide_DIM - 1) 'weigth+ layer

Dim As Sinaps y( OUT_DIM - 1) ' output layer

For e As Integer = 0 To MAX_EVOLUTION
    ? "Input:", "Hide:", "Ouput:"', "Result:"
    ?

    For i As Integer = 0 To UBound( x)
  h(i).predict( x(), w1(), b1())
  'relu( h())

  If i<= UBound( y) Then
   y(i).predict( h(), w2(), b2())
   'f01( y())

   ? x(i).value, len8( h(i).value),
   '? x(i).value, len8( w1(i).value + b1(i).value), len8( h(i).value), len8( w2(i).value + b2(i).value),
   ? len8( y(i).value)
   b2(i).value = f( y(i).value)
   b1(i).value = f( y(i).value + b2(i).value)
  Else
   ? x(i).value, len8( h(i).value)
  EndIf
    Next
    ? "_________________________ ";

    Dim As String class_names(...) = { "Setosa", "Versicolor", "Virginica"}
    ? " Result = ";class_names( argMax( y()))
    ?
Next
/'
For each(i in y)
    i.printall()
    ?
Next
'/
Sleep
'/


polopok

Сообщение отредактировал ntvgjhfnj - Понедельник, 05.12.2022, 12:05
 
haavДата: Понедельник, 05.12.2022, 20:20 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Я этим никогда не интересовался, но вот ссылочки , может что-то подойдет:
https://www.freebasic.net/forum/viewtopic.php?p=289082#p289082
https://www.freebasic.net/forum/viewtopic.php?t=31657
https://www.freebasic.net/forum/viewtopic.php?t=29244


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ntvgjhfnjДата: Вторник, 06.12.2022, 03:01 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 61
Репутация: 1
Статус: Offline
Огромное спасибо !!!

Добавлено (09.12.2022, 18:15)
---------------------------------------------
Ссылка на видео взятое за основу: Нейронная сеть на Python с нуля
Ссылка на использумый компонент np.bi: vectorArray
Код примера адаптированного под Freebasic :
Код

/'
  neuron.bas
'/

#Include "np.bi"

#Define lin ? "____________________________________ "; : ?
#Define pnt( t ) ? "[ "; #t ;" ] length = "; t.length, "dimencion = ";UBound(t.n)+1 : ? : t.print : lin : ?

#Define INPUT_DIM 4
#Define OUTPUT_DIM 3
#Define HIDE_DIM 5

'-- --

Var x = np.rndAr( INPUT_DIM)

Var w1 = np.rndAr( HIDE_DIM, INPUT_DIM) ': pnt( W1)
Var b1 = np.rndAr( HIDE_DIM)
Var w2 = np.rndAr( OUTPUT_DIM, HIDE_DIM)
Var b2 = np.rndAr( OUTPUT_DIM)

Var t1 = np.Ar( HIDE_DIM)
Var h1 = np.Ar( HIDE_DIM)
Var t2 = np.Ar( OUTPUT_DIM)
Var z = np.Ar( OUTPUT_DIM)

/' Установка значений массивов. А нету значений , надо обучать !!!
Dim As Double ar_X( INPUT_DIM - 1) = { 1,2,3,4}

Dim As Double ar_W1( HIDE_DIM - 1, INPUT_DIM - 1) = { { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}}
Dim As Double ar_B1( HIDE_DIM - 1) = { 1,2,3,4,5}  

Dim As Double ar_W2( HIDE_DIM - 1, INPUT_DIM - 1) = { { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}}
Dim As Double ar_B2( HIDE_DIM - 1) = { 1,2,3,4,5}  

x.copy( ar_X())
w1.copy( ar_W1())
b1.copy( ar_B1())
w2.copy( ar_W2())
b2.copy( ar_B2())
'/

'-- Predict --
'[
t1 = x & w1 : pnt( T1)
h1 = t1.relu : pnt( H1)
t2 = h1 & w2 + b2 : pnt( T2)
z = t2.softmax() : pnt( Z)
']

Var probs = np.Ar(0)
probs = z
Dim As Integer pred_class = np.ArgMax( probs) : ? "ArgMax = "; pred_class : ?

Dim As String class_name(...) = { "Setosa", "Versicolor", "Virginica"}
Print " In classes: "; class_name(0);", "; class_name(1);", ";class_name(2) : ?
Print " Predicted class: "; class_name( pred_class)

Sleep
End


К сожалению пришлось присваивать значения через копирование. Если есть идеи , рассмотрю с удовольствием.

Добавлено (09.12.2022, 19:22)
---------------------------------------------
Несколько изменений, расшаренные вектор-массивы для использования в функциях.

код:

Код

/'
  neuron.bas
'/

#Include "np.bi"

#Define lin ? "____________________________________ "; : ?
#Define pnt( t ) ? "[ "; #t ;" ] length = "; t.length, "dimencion = ";UBound(t.n)+1 : ? : t.print : lin : ?

#Define INPUT_DIM 4
#Define OUTPUT_DIM 3
#Define HIDE_DIM 5

'-- --

Var x = np.rndAr( INPUT_DIM)

Dim Shared As np.vectorArray w1, b1, w2, b2, t1, h1, t2
w1 = np.rndAr( HIDE_DIM, INPUT_DIM) ': pnt( W1)
b1 = np.rndAr( HIDE_DIM)
w2 = np.rndAr( OUTPUT_DIM, HIDE_DIM)
b2 = np.rndAr( OUTPUT_DIM)

t1 = np.Ar( HIDE_DIM)
h1 = np.Ar( HIDE_DIM)
t2 = np.Ar( OUTPUT_DIM)
Var z = np.Ar( OUTPUT_DIM)

/' Set arrays values
Dim As Double ar_X( INPUT_DIM - 1) = { 1,2,3,4}

Dim As Double ar_W1( HIDE_DIM - 1, INPUT_DIM - 1) = { { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}}
Dim As Double ar_B1( HIDE_DIM - 1) = { 1,2,3,4,5}  

Dim As Double ar_W2( HIDE_DIM - 1, INPUT_DIM - 1) = { { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}, { 0,0,0,0}}
Dim As Double ar_B2( HIDE_DIM - 1) = { 1,2,3,4,5}  

x.copy( ar_X())
w1.copy( ar_W1())
b1.copy( ar_B1())
w2.copy( ar_W2())
b2.copy( ar_B2())
'/

'-- Forward --
'[
function Predict( x As np.vectorArray) As np.vectorArray
    t1 = x & w1 : pnt( T1)
    h1 = t1.relu : pnt( H1)
    t2 = h1 & w2 + b2 : pnt( T2)
    Return t2.softmax()
End Function

z = Predict( x) : pnt( Z)
']

Var probs = np.Ar(0)
probs = z
Dim As Integer pred_class = np.ArgMax( probs) : ? "ArgMax = "; pred_class : ?

Dim As String class_name(...) = { "Setosa", "Versicolor", "Virginica"}
Print " In classes: "; class_name(0);", "; class_name(1);", ";class_name(2) : ?
Print " Predicted class: "; class_name( pred_class)

Sleep
End


Добавлено (13.12.2022, 00:13)
---------------------------------------------
np.bi заменить на этот



Теперь можно проводить инициацию массива (только цифры !!!)
Код

/'
  test.bas
'/

#Include "np.bi"

#Define lin ? "____________________________________ "; : ?
#Define pnt( t ) ? "[ "; #t ;" ] length = "; t.length, " n = ";t.n(0);", ";t.n(1) : ? : t.print : lin : ?
'#Define ppnt( t ) ? "[ "; #t ;" ] length = ";UBound(t)+1, "dimencion = ";UBound(t,0) : np.PPrint( t()) : ?

#Define W 3
#Define H 2

Var result = np.Ar(2) : pnt(Result)

Var x = ___(1,2) : pnt(X)  ' Вот она, инициация массива

result = ___(1,2,3.5) : pnt(Result) ' И тут тоже она

Добавлено (13.12.2022, 00:26)
---------------------------------------------
Правда такая инициация , только одномерного массива

Код

Var x = ___(1, 2, 0.2, -3.4, 0.001)


многомерные только через Copy()


polopok

Сообщение отредактировал ntvgjhfnj - Вторник, 13.12.2022, 00:14
 
ntvgjhfnjДата: Среда, 14.12.2022, 12:48 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 61
Репутация: 1
Статус: Offline
Архив : "Модуль" np.bi с примерами и readme
Прикрепления: 7470678.rar (6.4 Kb)


polopok
 
  • Страница 1 из 1
  • 1
Поиск: