我正在尝试将简单前馈神经网络适用于简单数据,而我的目标是仅近似(a b c)/ d
max_a=2
max_b = 3000
max_c=10
max_d=1
def generate_data(no_elements=10000):
a = np.random.uniform(0,max_a,no_elements)
b = np.random.uniform(1,max_b,no_elements)
c=np.random.uniform(0.001,max_c,no_elements)
d=np.random.uniform(0.00001,max_d,no_elements)
df=pd.DataFrame({"a":a,"b":b,"c":c,"d":d})
e=(df.a*df.b*df.c)/df.d
df["e"]=e
return(df)
这就是我生成数据的方式
然后我进行了数据标准化
df = generate_data(5000)
np_df=df.iloc[:,:4]
means=np.mean(np_df,axis=0,keepdims=True)
stds=np.std(np_df,axis=0,keepdims=True)
x_train = (np_df-means)/stds
y_train = np_df[:,4]
我已经建立了一个简单的pytorch网络进行回归分析,因此它必须预测' e '
class network_Regression(nn.Module):
def __init__(self,layers):
super(network_Regression, self).__init__()
self.linear = nn.ModuleList()
self.relu = nn.ModuleList()
self.layers = layers
for i in range(len(layers)-1):
self.linear.append(nn.Linear(layers[i],layers[i+1]))
if i+1 != len(layers)-1:
self.relu.append(nn.ReLU())
def forward(self,out):
for i in range(len(self.relu)):
out = self.linear[i](out)
out = self.relu[i](out)
out = self.linear[-1](out)
return out
model = network_Regression([4,10,10,1])
criterion= nn.MSELoss()
optimizer=optim.Adam(model.parameters())
但是当我尝试训练这些网络时,尝试的时期从[1000到0.5M]
仍然无法找到一个简单的公式(((a b c)/ d)= e
我尝试更改各种隐藏层级别,但丢失程度约为9位数
model.train()
num_epochs = 1000
loss_list=[]
for epoch in range(num_epochs):
for batch_idx, (data, target) in enumerate(data_loader):
#print(batch_idx)
data, target = Variable(data), Variable(target)
optimizer.zero_grad()
output = model(data.float())
loss = criterion(output, target.float())
#print(batch_idx, loss.data[0])
loss.backward()
optimizer.step()
if epoch >2:
if batch_idx % 200 == 0:
loss_list.append(loss.data.item())
if batch_idx % 400 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(data_loader.dataset),
100. * batch_idx / len(data_loader), loss.data.item()))
答案 0 :(得分:0)
类似神经网络的乘法和除法运算很差。
查看this了解详情。
所以基本上我必须对数据进行对数转换,在上述情况下,要近似((a b c)/ d)= e ,神经网络必须找出根据这个问题,复杂的乘法和除法变为 ln(a)+ ln(b)+ ln(c)-ln(d)= ln(e),然后取反在ln(e)的日志中,这个想法行之有效。