ランダムな数字をいれて動かしてみると
初期化しただけで学習はさせてませんが
出力の値がとても大きいです こういう物ですか?
出力の値 [[-579.5 358.2]]たまに2000とかになる
試したこと
全結合を作り直したり wの分布を変えた
活性化関数 class swish(nn.Module): def __init__(self, beta = 1.25): super().__init__() self.beta = beta def forward(self, inputs): return inputs * torch.sigmoid(self.beta * inputs) class mish(nn.Module): def __init__(self): super().__init__() def forward(self, inputs): return inputs * torch.tanh(F.softplus(input)) 全結合 class Dense(nn.Module): def __init__(self, input_dim, output_dim, activation=lambda x: x,loc= 0,scale = 0.6,): ''' 引数: input_dim: 入力次元 output_dim: 出力次元 activation: 活性化関数 パラメータ: W: 重み b: バイアス ''' super().__init__() self.weight = \ nn.Parameter(torch.Tensor( np.random.normal(loc=loc,scale=scale,size=(input_dim,output_dim)))) self.bias = \ nn.Parameter(torch.Tensor( np.zeros(output_dim))) self.activation = activation def forward(self, x): print(self.weight[0]) return self.activation(torch.matmul(x, self.weight) + self.bias) 初期化 def init_weights(m): if type(m)==nn.Linear or type(m)==nn.Conv2d or type(m)==Dense: nn.init.kaiming_normal_(m.weight, a=0, mode='fan_in') m.bias.data.fill_(0) from torch.autograd import Variable モデル class QNetwork(nn.Module): def __init__(self, num_inputs, num_outputs,device): super(QNetwork, self).__init__() self.hidden_size=25*25 self.hidden_CNN=256*25*25 self.hidden_size1=25*25 self.hidden_size2=None self.device=device self.cnn1 = nn.Sequential( nn.Conv2d(3, 16, kernel_size=(3,3), padding=1), nn.Conv2d(16, 16, kernel_size=(3,3), padding=1), nn.MaxPool2d(kernel_size=(2,2), stride=(2,2)), CNN nn.Conv2d(256, 256, kernel_size=(3,3), padding=1), nn.MaxPool2d(kernel_size=(2,2), stride=(2,2))) self.cnn1.apply(init_weights) self.net= nn.Sequential( Dense(self.hidden_CNN, self.hidden_size1,activation=swish(0.9)), Dense(self.hidden_size1, self.hidden_size1,activation=swish()), Dense(self.hidden_size1, self.hidden_size1,activation=swish()) ) self.net.apply(init_weights) self.a = Dense(self.hidden_size, self.hidden_size,activation=swish(0.7)) init_weights(self.a) self.V_q = Dense(self.hidden_size, 1)# V_q self.V = Dense(self.hidden_size, 1)# V self.mu = Dense(self.hidden_size, num_outputs)# mu init_weights(self.V) init_weights(self.V_q) init_weights(self.mu) def forward(self,inputs,net): if net=="net_q": x, u = torch.from_numpy(inputs).to(self.device) x=x.permute(0 ,3, 1, 2) else: x = torch.from_numpy(inputs).to(self.device) x=x.permute(0 ,3, 1, 2) #------------------------------------ x=self.cnn1(x) x=x.contiguous().view(-1, 1).T x=self.free_net(x) #---------------------------------- x=self.a(x) if net=="net_v": V=self.V(x)+-self.V_q(x) return V.to('cpu').detach().numpy().copy() if net=="net_a": mu =self.mu(x) return mu.to('cpu').detach().numpy().copy() モデルの設定 device = 'cuda' if torch.cuda.is_available() else 'cpu' print(device) mainQN = QNetwork((3,400,400),2,device).to(device) optimizer = optim.Adam(mainQN.parameters(), lr=0.001) mainQN, optimizer = amp.initialize(mainQN, optimizer, opt_level="O1")#-------------- criterion = nn.MSELoss() mainQN.eval() #mainQN.sample_noise print(mainQN.forward(np.random.rand(1,400,400,3),"net_v")) print(mainQN.forward(np.random.rand(1,400,400,3),"net_a"))
weight をprintした結果(forward時にprintしてるからheで初期化済みなはず)
[-7.5829e-02, -3.2249e-02, 6.5457e-02, -1.6125e-02, 2.3056e-02, -3.0077e-02, -1.4512e-02, -9.7091e-02, 2.3019e-02, -3.0182e-02, 2.1734e-03, 8.7193e-02, 2.5717e-02, 8.9440e-03, -7.8190e-02, -6.4081e-04, 1.4192e-02, -8.9038e-03, -4.0937e-02, 5.2399e-03, -1.5022e-01, -8.0301e-02, 7.1431e-02, 4.3368e-02, -4.0728e-02, 1.0702e-02, 7.7349e-03, 2.6308e-02, 7.5558e-02, -5.1390e-02, -3.5322e-02, -5.4469e-02, -4.3117e-02, 7.9836e-02, 1.1570e-01,
これは正常に作動しているのでしょうか?
わかる人教えてください
あなたの回答
tips
プレビュー