Open ALein opened 5 years ago
你的tensorflow版本中,_build_network()返回的act_probs是softmax之后的概率值,而loss中需要的是log(act_probs),所以loss计算有问题;Pytorch版本计算是正确的;
谢谢,loss中加了log之后,然后发现 batch_normalization() 函数的 axis 应该置 1,因为我的data_format='channels_first',改了这两个问题之后发现loss值大概是4.5的样子,但是还是不收敛,不知道什么原因,能再帮我看看么,万分感谢
self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(self.loss)
改成: with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)): self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(self.loss)
我在您的网络基础上修改了一下,在使用tensorflow构建网络训练时,loss值很小,只有大概0.9,且一直不收敛,于是我这边又按照我写的tensorflow的网络结构写了一个pytorch版本的网络,pytorch版本的训练出来的模型是没有问题的,两个网络的结构都是一样的,并且我都使用的相同的训练参数以及游戏数据接口,但是使用tensorflow写的那份一直有问题,我找了很久都没找到问题所在,能帮我看看问题出在哪里吗?万分感谢 附上tensorflow版本的代码 (这是有问题的一份) `# D:\anaconda\envs\tensorflow\python
* coding:utf-8 *
import numpy as np import tensorflow as tf from logger import logger
from config import *
class PolicyValueNet: """ policy-value-network """
if name == 'main': net = PolicyValueNet(3) `
另外附上pytorch版本的代码 `# -- coding: utf-8 --
@Desc : ==============================================
import torch import torch.nn as nn import torch.nn.functional as F
from config import *
DEVICE = torch.device('cuda')
class Flatten(nn.Module): def init(self): super(Flatten, self).init()
class ResidualBlock(nn.Module): def init(self, n_f): super(ResidualBlock, self).init() self.residual = nn.Sequential( nn.Conv2d(n_f, n_f, 3, 1, 1), # 输入和输出的feature 大小不变 nn.BatchNorm2d(n_f), nn.ReLU(), nn.Conv2d(n_f, n_f, 3, 1, 1), nn.BatchNorm2d(n_f), )
class Network(nn.Module): def init(self, board_size, n_f=256, n_res=3): super(Network, self).init()
网络结构
class PolicyValueNet: def init(self, board_size, init_lr=LR, weight_decay=L2_WEIGHT_DECAY): self.policy_value_net = Network(board_size) self.trainer = torch.optim.Adam(self.policy_value_net.parameters(), lr=init_lr, betas=[0.7, 0.99], weight_decay=weight_decay) self.l2_loss = nn.MSELoss()
`