TransWikia.com

Замена функции активации в нейронной сети. Python

Stack Overflow на русском Asked by SatOrY on December 22, 2021

Есть код простенькой нейронной сети (кусок)

import numpy as np

def net_build():
    def linear(_in, _out):  # network linear layer
        w = np.random.randn(_in * _out).astype(np.float32) * .1
        b = np.random.randn(_out).astype(np.float32) * .1
        return (_in, _out), np.concatenate((w, b))

    s0, p0 = linear(4, 10)
    s1, p1 = linear(10, 10)
    s2, p2 = linear(10, 2)
    return [s0, s1, s2], np.concatenate((p0, p1, p2))

shapes, params = net_build()

Уже неделю пытаюсь поменять функцию активации с линейной, тут

s1, p1 = linear(10, 10)** 

на Sigmoid / ReLu и ничего не выходит.

З.Ы. сам ни капли не программист, так что буду признателен любой помощи.


Попробуйте написать функцию активации, которая возвращает сам элемент без изменений

Попробовал, вот что получилось и оно работает

import numpy as np

def net_build():
    def linear(_in, _out):  # network linear layer
        w = np.random.randn(_in * _out).astype(np.float32) * .1
        b = np.random.randn(_out).astype(np.float32) * .1
        return (_in, _out), np.concatenate((w, b))

    def sigmoid(_in, _out):  # network sigmoid layer
        def sgm(x):
            return x #1 / (1 + np.exp(-x))
        w = np.random.randn(_in * _out).astype(np.float32) * .1
        b = np.random.randn(sgm(_out)).astype(np.float32) * .1
        return (_in, _out), np.concatenate((w, b))

    s0, p0 = linear(4, 10)
    s1, p1 = sigmoid(10, 10)
    s2, p2 = linear(10, 2)
    return [s0, s1, s2], np.concatenate((p0, p1, p2))

shapes, params = net_build()
print(shapes, params)

а потом заменить её на сигмоид короче

Заменил и теперь оно выдает ошибку:

import numpy as np

def net_build():
    def linear(_in, _out):  # network linear layer
        w = np.random.randn(_in * _out).astype(np.float32) * .1
        b = np.random.randn(_out).astype(np.float32) * .1
        return (_in, _out), np.concatenate((w, b))

    def sigmoid(_in, _out):  # network sigmoid layer
        def sgm(x):
            return 1 / (1 + np.exp(-x))
        w = np.random.randn(_in * _out).astype(np.float32) * .1
        b = np.random.randn(sgm(_out)).astype(np.float32) * .1
        return (_in, _out), np.concatenate((w, b))

    s0, p0 = linear(4, 10)
    s1, p1 = sigmoid(10, 10)
    s2, p2 = linear(10, 2)
    return [s0, s1, s2], np.concatenate((p0, p1, p2))

shapes, params = net_build()
print(shapes, params)

Сама ошибка:

Traceback (most recent call last):
  File "E:/_NN/tests12_Sigm/data/b.py", line 22, in <module>
    shapes, params = net_build()
  File "E:/_NN/tests12_Sigm/data/b.py", line 18, in net_build
    s1, p1 = sigmoid(10, 10)
  File "E:/_NN/tests12_Sigm/data/b.py", line 13, in sigmoid
    b = np.random.randn(sgm(_out)).astype(np.float32) * .1
  File "mtrand.pyx", line 1232, in numpy.random.mtrand.RandomState.randn
  File "mtrand.pyx", line 1389, in numpy.random.mtrand.RandomState.standard_normal
  File "_common.pyx", line 577, in numpy.random._common.cont
TypeError: 'numpy.float64' object cannot be interpreted as an integer

One Answer

У вас это неправильно

 b = np.random.randn(sgm(_out)).astype(np.float32) * .1

Видимо нужно

 b = np.random.randn(_out).astype(np.float32) * .1

sgm дает float,а np.random.randn нужно int(целое).

Answered by Константин on December 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP