【pythonでニューラルネットワーク#8】線形変換と活性化関数と損失関数

記事の目的

pythonで線形変換と活性化関数と損失関数を実装していきます。ここにある全てのコードは、コピペで再現することが可能です。

 

目次

  1. それぞれの関数
  2. 線形変換の実装
  3. 活性化関数の実装
  4. 損失関数の実装

 

1 それぞれの関数

 

2 線形変換の実装

# In[1]
import numpy as np
np.random.seed(1)

# In[2]
class Optimizer:
    def step(self, lr):
        self.w -= lr * self.dw
        self.b -= lr * self.db

class Linear(Optimizer):
    
    def __init__(self, x_n, y_n):
        self.w = np.random.randn(x_n, y_n) * np.sqrt(2/x_n)
        self.b = np.zeros(y_n)
        
    def forward(self, x):
        self.x = x
        self.y = np.dot(x, self.w) + self.b
        return self.y
    
    def backward(self, dy):
        self.dw = np.dot(self.x.T, dy)
        self.db = np.sum(dy, axis=0)
        self.dx = np.dot(dy, self.w.T)
        return self.dx

# In[3]
x = np.random.randn(5,10)
x

# In[4]
model = Linear(10, 3)
y1 = model.forward(x)
y1

# In[5]
model.backward(np.ones((5,3))).shape

# In[6]
model.dw

# In[7]
model.db

 

3 活性化関数の実装

# In[8]
class Relu:
    
    def forward(self, x):
        self.x = x
        y = np.where(self.x <= 0, 0, self.x)
        return y
    
    def backward(self, dy):
        dx =dy * np.where(self.x <= 0, 0, 1)
        return dx

# In[9]
y1

# In[10]
relu = Relu()

# In[11]
y2 = relu.forward(y1)
y2

# In[12]
relu.backward(1)

 

 

4損失関数の実装

# In[13]
class CELoss:
    
    def forward(self, x, t):
        self.t = t
        self.y = np.exp(x)/np.sum(np.exp(x), axis=1, keepdims=True)  # ソフトマックス関数
        L = -np.sum(t*np.log(self.y+1e-7)) / len(self.y)
        return L
    
    def backward(self):
        dx = self.y - self.t
        return dx

# In[14]
y2

# In[15]
t = np.zeros((5,3))
t[0,0], t[1,0], t[2,2], t[3,2], t[4,0] = np.ones(5)
t

# In[16]
loss = CELoss()

# In[17]
loss.forward(y2,t)

# In[18]
loss.backward()