- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用一个宠物示例来优化连接到softplus的密集层的参数并输出负二项式分布的参数。我的流程是:
1) 使用前向和后向方法构建负对数似然损失的自定义类。它获取分布参数和目标作为输入,并输出损失(在目标上评估的建模分布的负对数似然):
from scipy.special import gamma, digamma, binom
from cntk.ops.functions import UserFunction
import numpy as np
class NegBin_Loss_Deep_NoSP(UserFunction):
def __init__(self, dis_params, target, name='NegBin_Loss_Deep_NoSP'):
super(NegBin_Loss_Deep_NoSP, self).__init__([dis_params, target], name=name)
def forward(self, arguments, device=None, outputs_to_retain=None):
self.miu = arguments[0][0][0]
self.alpha = arguments[0][0][1]
target = arguments[1][0]
#Compute the likelihood of the target
LL = binom(target+(1/self.alpha)-1,target)*((1/(1+self.alpha*self.miu))**(1/self.alpha))*(((self.alpha*self.miu)/(1+self.alpha*self.miu))**target)
log_ll = np.log(LL)
# Loss is the negative log likelihood
return target, -log_ll
def backward(self, state, root_gradients, variables):
target = state
for idx in range(len(self.inputs)):
if self.inputs[idx] in variables:
gradient = np.array([-(target-self.miu)/(self.alpha*(self.miu**2)+self.miu), # miu derivative
-((self.miu*self.alpha+1)*np.log(self.miu*self.alpha+1)+(-self.miu*digamma((1/self.alpha)+target)+self.miu*digamma(1/self.alpha)+target-self.miu)*self.alpha-digamma((1/self.alpha)+target)+digamma(1/self.alpha))/(self.miu*(self.alpha**3)+(self.alpha**2))])[:,0] # alpha derivative
variables[self.inputs[idx]] = gradient
return root_gradients*gradient
def infer_outputs(self):
return [output_variable(self.inputs[1].shape, self.inputs[0].dtype, self.inputs[1].dynamic_axes)]
@staticmethod
def deserialize(inputs, name, state):
f = NegBin_Loss_Deep_NoSP(inputs[0], inputs[1], name)
return f
2) 使用自定义脚本对前向和后向方法进行数值测试。实例化上述类,传递一个输入数组,并使用前向和后向更新输入数组并验证损失的减少。 按预期工作
def grad_clipper(grad_v, trunc_max=0.005,trunc_min=-0.005):
if trunc_min >= trunc_max:
raise Exception("lower clipping bound has to be lower than upper bound")
for idx, value in enumerate(grad_v):
grad_v[idx] = max(min(value,trunc_max),trunc_min)
return grad_v
def convergence_test():
iter_num = 500000
noise_magnitude = 0.15
target = np.array([3.]) # [0.5, 0]
params = [5, 0.5]
v = C.input_variable(shape=(2,), needs_gradient=True)
t = C.input_variable(shape=(1,))
lr = 0.0005
a = NegBin_Loss_Deep_NoSP(v,t)
for i in range(iter_num):
target_new = (1+(0.5-np.random.rand())*noise_magnitude)*target
state, loss = a.forward([[params],target_new], [a.output], set([a.output]))
if i%1000 == 0:
print("loss", loss)
grad = grad_clipper(a.backward(state, np.ones_like(params), set([v])))
if i%1000 == 0:
print("params:", params, "gradient:", grad)
params = np.sum([params,[l * lr for l in grad]],axis=0)
params[1] = max(params[1], 5e-6)
convergence_test()
3)利用CNTK的学习器构建宠物示例模型并优化分布参数。我无法更新密集层的参数,我错过了什么?
import cntk as C
from cntk.layers import *
# Simple model to experiment gradient descent on the weights of the dense layer
def model0(x):
with default_options(initial_state = 0.1, enable_self_stabilization=True,init=glorot_uniform()):
m = Dense(2, activation = None)(x)
m = C.ops.softplus(m)
return m
# input sequences
x = C.input_variable(shape=(2,))
t = C.input_variable(shape=(1,))
# create the model
m0 = model0(x)
# define the learning rate
learning_rate = 0.02
lr_schedule = C.learning_parameter_schedule(learning_rate)
# define loss and error function
loss = NegBin_Loss_Deep_NoSP(m0.output, t)
error = NegBin_Loss_Deep_NoSP(m0.output, t)
# use fsadagrad optimizer
momentum_schedule = momentum_schedule = C.momentum_schedule(0.9)
learner = C.fsadagrad(m0.parameters,
lr = lr_schedule,
momentum = momentum_schedule,
unit_gain = True)
trainer = C.Trainer(m0, (loss, error), [learner])
loss_summary = []
start = time.time()
x1 = np.array([3,0.002], dtype=np.float32)
y1 = np.array([2.5], dtype=np.float32)
for epoch in range(0, 10):
trainer.train_minibatch({x: x1, t: y1})
if epoch % (10 / 10) == 0:
training_loss = trainer.previous_minibatch_loss_average
loss_summary.append(training_loss)
print("epoch: {}, loss: {:.5f}".format(epoch, training_loss))
4)按照雪花的建议,使用原生 CNTK 损失函数测试宠物示例。通过调整 3) 中的 stub ,我引入了带有平方损失的类似测试。我可以确认,通过这种方式,模型正在更新其参数,并且损失随着训练而减少。我相信此测试将问题限制在我在 1) 中放置的自定义损失函数
x = C.input_variable(shape=(2,))
t = C.input_variable(shape=(2,)) # -> Changed in 4)
# create the model
m0 = model0(x)
# the learning rate
learning_rate = 0.02
lr_schedule = C.learning_parameter_schedule(learning_rate)
# loss function
loss = C.squared_error(m0.output, t) # -> Changed in 4)
error = C.squared_error(m0.output, t) # -> Changed in 4)
# use fsadagrad optimizer
momentum_schedule = C.momentum_schedule(0.9)
learner = C.fsadagrad(m0.parameters,
lr = lr_schedule,
momentum = momentum_schedule,
unit_gain = True)
trainer = C.Trainer(m0, (loss, error), [learner])
loss_summary = []
start = time.time()
x1 = np.array([3, 0.002], dtype=np.float32)
y1 = np.array([2.5, 0.005], dtype=np.float32) # -> Changed in 4)
for epoch in range(0, 10):
trainer.train_minibatch({x: x1, t: y1})
if epoch % (10 / 10) == 0:
training_loss = trainer.previous_minibatch_loss_average
loss_summary.append(training_loss)
print("epoch: {}, loss: {:.5f}".format(epoch, training_loss))
是什么导致 1) 中的损失函数不允许我的模型进行训练?
谢谢
<小时/>编辑:解决了,谢谢雪花!
最佳答案
鉴于您的损失函数接受多个输入。变量将是变量的字典。
执行此操作变量=梯度
会覆盖字典。
您应该执行类似 variables[var] = ... # 计算 var 的梯度
关于python - 在宠物示例中实现自定义负对数似然损失时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58237023/
我想在 python 中找出一个整数的 log10,但我得到了一个错误,比如数学域错误 我的代码是这样的w=math.log10(q*q1)/math.log10(2) 其中 q1,q2 是整数 是的
舍入小数 在 NumPy 中,主要有五种方法来舍入小数: 截断 去除小数部分,并返回最接近零的浮点数。使用 trunc() 和 fix() 函数。 示例: import numpy as n
我有一个数值范围为 0 到 100 的 slider 。 我想将它们映射到 100 到 10,000,000 的范围内。 我在网上看到过一些函数,但它们都是用 C++ 编写的。我需要它在 Javasc
我想请用户输入一个整数(N),然后显示他/她输入的整数的 10 对数。我已经成功计算了 10 对数,但不知道如何像下面这样显示它: Write in an Integer: 455666 455666
我将 x 轴设置为对数刻度。最大值为10000,最小值为1。 GraphPane mypane = zedgraphcontrol.GraphPane; mypane.XAxis.Type = Axi
我正在尝试编写一个快速算法来计算 log gamma function 。目前我的实现看起来很幼稚,只是迭代了 1000 万次来计算 gamma 函数的对数(我还使用 numba 来优化代码)。 im
这个问题在这里已经有了答案: How to show minor tick labels on log-scale with Matplotlib (2 个答案) 关闭 7 年前。 将行 plt.y
抱歉标题不好 ;) 我正在尝试重新创建我在其他一些工作中遇到的 matlab 图,但我不太了解他们使用的比例。 y轴增量如下(从上往下[+ve y]): 0.9999,0.999,0.99,0.9,0
由于 1000 的以 10 为底的对数是 3,您可能期望 Math::log(1000, 10) 返回 3。相反,它返回 2.9999999999999996。 这是因为 Ruby 中的 float
我对对数 X 轴有疑问。阈值大于 0,x 的最小值为 1,并且所有 X 值都大于 0。并且仍然给我相同的错误 Can't plot zero or subzero values on a logari
我需要在我的应用程序中实现折线图,我想使用 MPAndroidChart。问题是 y 轴上的值将介于 1 和 1x10^-12 之间。这就是为什么我需要在该轴上的对数 View 。 有没有办法用那个库
我正在尝试按照 Logarithmic slider 中的示例进行操作. 这是我使用的代码: Timeline._MIN_PER_MINUTE = 1; Timeline._MIN_PER_HOUR
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我尝试为对数 y 轴绘制条形图。不幸的是,如果我将 y 轴设置为对数,则不再有条形图。我该怎么做才能实现这一目标?是否可以在 bar-function 中设置引用点(默认似乎为零)? 我的代码是: i
所以我一直在努力掌握 Big Oh 的计算方法。我觉得我已经掌握了基础知识,但对看似非常简单的计算感到困惑。所以如果下面的计算有很大的 O(n log n)(我真的希望我至少做对了)改变循环的顺序对复
我知道二维绘图的 semilogx 和 semilogy。 SURF 和 MESH 有什么等价物吗? 最佳答案 如上述链接所述,要将所有三个轴设置为对数刻度,请使用 set(gca, 'XScale'
这看起来很简单,但我在用 Ruby 计算 log (Base 5) 时遇到了问题。 显然标准的 base-10 日志工作正常: >> value = Math::log(234504) => 12.3
这段代码是用 C 语言根据 pollard 的对数 rho 算法(来自 wiki)编写的。在此代码中,如果我输入 alpha=2、beta=5、N=1019,则必须返回 a=681、b=378、A=3
有了this question之后通过指向 an external site 的链接回答,我意识到我解决了一个问题,只是为了得到另一个问题:在对数刻度上,MESH 和 SURF 函数的 C=Z 参数不
我正在尝试解决 the SPOJ problem PGCD , 它询问最大公约数表中出现了多少个素数。 我想到的第一个想法是先通过筛分生成素数。 然后,对于每个素数 p,查看有多少对(a,b),其中
我是一名优秀的程序员,十分优秀!