我正在使用Scala Breeze开发一个简单的分类算法。我想使用Breeze数字将不同的函数应用于我正在使用的矩阵,特别是sigmoid和tanh。单独使用sigmoid很好,但我想通过将函数指定为字符串参数然后在方法中使用它来选择sigmoid或tanh。我试过了:
// this code works
import breeze.numerics._
val H: BDM[Double] = sigmoid((M(::,*) + bias).t)
// this code throws an error
def activationFuncBreeze(af: String) = af match {
case "sigmoid" => sigmoid
case "tanh" => tanh
}
val H: BDM[Double] = activationFuncBreeze(af)((M(::,*) + bias).t)
错误是
Error:(60, 50) could not find implicit value for parameter impl: breeze.generic.UFunc.UImpl[_13.type,breeze.linalg.DenseMatrix[Double],VR]
val H: BDM[Double] = activationFuncBreeze(af)((M(::,*) + bias).t)
,下一个错误是:
Error:(60, 50) not enough arguments for method apply: (implicit impl: breeze.generic.UFunc.UImpl[_13.type,breeze.linalg.DenseMatrix[Double],VR])VR in trait UFunc.
未指定的值参数impl。 val H:BDM [Double] = activationFuncBreeze(af)((M(::,*)+ bias).t)
我已经查找了Breeze数字并实现了UFuncs但是sigmoid和tanh已经存在于Breeze.numerics库中作为elementwise UFuncs所以我应该能够轻松地使用它们。任何建议赞赏
答案 0 :(得分:0)
将矩阵引入函数似乎有效:
def calculateH(af: String): BDM[Double] = af match {
case "sigmoid" => sigmoid((M(::, *) + bias).t)
case "tanh" => tanh((M(::, *) + bias).t)
case "sin" => sin((M(::, *) + bias).t)
case _ => throw new IllegalArgumentException("Activation function must be sigmoid, tanh, sin")
}
val H = calculateH(af)