鱼C论坛

 找回密码
 立即注册
查看: 1424|回复: 1

关于神经网络的问题

[复制链接]
发表于 2023-12-20 10:35:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请大神赐教,我现在有一个n维样本X,它的方差为4点几,我用一个简单的网络,不进行任何训练(即不计算任何损失函数,不做反馈),相当于对X简单做一个函数变换F(X),得到与X等维的Y。

但是不管我这个网络怎么设计,得到的Y的方差总是接近于0. 有什么办法让Y的方差接近X的方差?

以下是我的相关代码:
  1. def ConvertTensor(vec,grad_flag=True):
  2.         return torch.tensor(vec,dtype=torch.float32,requires_grad=grad_flag)

  3. def Normalize(flat_geom):
  4.                 Nsample, ThreeN = flat_geom.shape
  5.                 mean_list = []
  6.                 std_list  = []
  7.                 norm_geom = copy.deepcopy(flat_geom)
  8.        
  9.                 for i in range(Nsample):
  10.                         each_geom = norm_geom[i]
  11.                         mean      = np.mean(each_geom)
  12.                         std       = np.std(each_geom)
  13.                         norm_geom[i] = (each_geom-mean)/std                       
  14.                         mean_list.append(mean)
  15.                         std_list.append(std)

  16.                
  17.                 return mean_list, std_list, norm_geom



  18. class Generator(nn.Module):
  19.         """ Architecture of the Generator, uses res-blocks """

  20.         def __init__(self):
  21.                 super().__init__()
  22.                
  23.                 self.activation_func = nn.ReLU()
  24.                 self.lr              = 2e-3
  25.                 self.inp_dim         = 186
  26.                 self.latent_dim      = 100       
  27.                 self.Nlayer          = 3
  28.        
  29.                 self.model           = self.G_model()

  30.         def G_model(self):
  31.                 module_list = []
  32.                 inp_dim = self.inp_dim

  33.                 latent_dim = self.latent_dim
  34.                 activation_func = self.activation_func
  35.                 Nlayer = self.Nlayer

  36.                 module_list.append(nn.Linear(inp_dim,latent_dim))
  37.                 module_list.append(activation_func)       
  38.        
  39.                 for i in range(Nlayer):
  40.                         module_list.append(nn.Linear(latent_dim,latent_dim))
  41.                         module_list.append(activation_func)

  42.                 module_list.append(nn.Linear (latent_dim, inp_dim)  )
  43.                 module_list.append(activation_func)       
  44.                 model = nn.Sequential(*module_list)

  45.                 return model

  46.         def forward(self,inp_dat):
  47.                 input_tensor = ConvertTensor(inp_dat,True) #include grad
  48.                 out=self.model(input_tensor)
  49.                
  50.                 return out

  51.         def train(self,inp_data):

  52.                 gen_tensor  = self.forward(inp_data)

  53.                 return gen_tensor




  54. if __name__=="__main__":
  55.         filename="LessConfig.dat"
  56.         flag=2
  57.         inp_data = np.loadtxt(filename)

  58.         norm_flag=1
  59.         if norm_flag==1:
  60.                 inp_tensor = ConvertTensor(inp_data,False)
  61.         if norm_flag==2:
  62.                 mean_list, std_list, norm_geom = Normalize(inp_data)               
  63.                 inp_tensor = ConvertTensor(norm_geom,False)
  64.                
  65.         generator = Generator()

  66.         for i in range(50):
  67.                 mean = torch.mean(inp_tensor[0]).detach().numpy()
  68.                 std  = torch.std(inp_tensor[0]).detach().numpy()
  69.                 print(" input mean and std:" , np.round(mean,4), np.round(std,4))
  70.                 gen_out = generator.train(inp_tensor[0])
  71.                 mean = torch.mean(gen_out).detach().numpy()
  72.                 std  = torch.std(gen_out).detach().numpy()
  73.                 print("output mean and std:" , np.round(mean,4), np.round(std,4))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-12-20 10:36:13 | 显示全部楼层
在神经网络中,方差的变化通常与激活函数的选择和网络的层数有关。您可以尝试以下几种方法来增加输出Y的方差:

1. 使用不同的激活函数:您可以尝试使用具有较大梯度的激活函数,例如Sigmoid函数或Tanh函数。这些函数相对于ReLU函数会产生更大的输出范围,可能会增加Y的方差。

2. 增加网络的层数:通过增加网络的层数,信息传递的路径会更长,可能会增加输出的方差。您可以尝试增加Generator类中的Nlayer参数,看看是否对Y的方差产生影响。

3. 调整学习率:您可以尝试调整学习率(self.lr)的大小。过大的学习率可能导致网络训练发散,但在不进行训练的情况下,适当增大学习率可能会增加Y的方差。

4. 尝试其他网络架构:除了ResNet,您还可以尝试其他类型的网络,例如全连接网络或卷积网络。不同的网络架构可能会产生不同的输出方差。

另外,您提供的代码片段似乎只是生成了一个网络模型,并没有对其进行训练或调用生成器生成输出Y的过程。如果您想要得到非零方差的输出,您需要对生成器进行训练,并使用损失函数和反向传播方法来调整网络参数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-24 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表