一个全连接的 ReLU 神经网络,一个隐藏层,没有 bias,用来从 x 预测 y。
题目要求:
- 用 numpy 实现两层神经网络拟合。
- 两层线性层:
h = W1 * x
h_relu = relu(h)
y = W2 * x - 优化方法使用随机梯度下降(SGD)
- Loss 函数使用均方误差函数(MSE)
代码实现:
import numpy as np
EPOCH = 500
LEARNING_RATE = 1e-6
N, D_in, H, D_out = 64, 1000, 100, 10
X=np.random.randn(N,D_in)
y=np.random.randn(N,D_out)
w1=np.random.randn(D_in,H)
w2=np.random.randn(H,D_out)
def relu(x):
return np.maximum(0,x)
def loss_function(y_pred,y):
result = np.subtract(y,y_pred)
result = np.power(result, 2)
result = np.mean(result)
return result
def grad(x,y,w1,w2):
h = np.dot(x, w1)
h_relu = relu(h)
y_pred = np.dot(h_relu, w2)
diff=-2*(y-y_pred)
dw2=h_relu.T.dot(diff)
dh_relu=diff.dot(w2.T)
dh = dh_relu.copy()
dh[h<0]=0
dw1=x.T.dot(dh)
return dw1,dw2
for i in range(EPOCH):
h=np.dot(X,w1)
h_relu=relu(h)
y_pred=np.dot(h_relu,w2)
loss=loss_function(y_pred,y)
if i%50==0:
print('epoch:',i,'loss:',loss)
for i in range(N):
index=np.random.randint(N)
xi=X[index:index+1]
yi=y[index:index+1]
dw1,dw2=grad(xi,yi,w1,w2)
w1=w1-LEARNING_RATE*dw1
w2=w2-LEARNING_RATE*dw2
print("y:",y)
print("pred_y",y_pred)