import torch
from torch.nn import Linear,ReLU,Sequential
from torch.optim import Adam
neuro_net = Sequential(
Linear(3,8), # 第一层有8个神经元,各有三个输入
ReLU(), # 第一层是非线性函数max(*,0)
Linear(8,8), # 第二层八个神经元,各自八个输入
ReLU(), # 同样的max(*,0)
Linear(8,1), # 最后一层是2个神经元,八个输入
)
def g(x,y) :
x0,x1,x2 = 1 , x[:,1] , x[:,2]**2
y0 = y[:,0]
return (1+x1+x2)*y0 - y0**2 - x1*x2
optimizer = torch.optim.Adam(neuro_net.parameters())
for step in range(100000) : # 迭代100000次
optimizer.zero_grad()
x = torch.randn(1000,3)
y = neuro_net(x)
outputs = g(x,y)
loss = - torch.sum(outputs)
loss.backward()
optimizer.step()
if(step % 100) == 0 :
print('iteration #{} : loss = {}'.format(step,loss.item())) #
############# 测试 #############################
x_test = torch.randn(2,3)
print('测试输入:{}'.format(x_test)) #把测试数据输出打印
y_test = neuro_net(x_test) # 把随机数据输入到网络里,得到y
print('本代码计算结果:{}'.format(y_test)) # 把y打印
print('g的值:{}'.format(g(x_test,y_test)))
# 根据理论计算参考答案
def argmax_g(x):
x0, x1, x2 = 1, x[:, 1] ,x[:, 2] ** 2
return 0.5 * (x0 + x1 + x2)[:, None]
yref_test = argmax_g(x_test)
print ('理论最优值: {}'.format(yref_test))
print ('g的值: {}'.format(g(x_test, yref_test)))
本样例采用了三层神经网络,一共17个神经元,是个比较简单直观的例子。
样例中将range循环从1000扩大到100000,结果基本保持了四位小数的准确性。