Rustで任意のndarrayの型に対してSigmoid関数を実装したいと考えています。
そこで、任意のndarrayに対して、expを実装を以下のように行いました。
rust
1use ndarray::{Array, Dimension}; 2use num_traits::Float; 3 4pub trait Exp { 5 type ExpType; 6 fn exp(&self) -> Self::ExpType; 7} 8 9impl<T: Float, U: Dimension> Exp for Array<T, U> { 10 type ExpType = Array<T, U>; 11 fn exp(& self) -> Self::ExpType { 12 self.map(|x| x.exp()) 13 } 14}
を用いて実装いたしました。このtraitは正常に動いているようです。
そこでこのexpを用いて、sigmoid関数を実装しようとしました。
実装を試みたコードは以下です。
rust
1// Sigmoid for Float and Array 2pub trait Sigmoid { 3 type SigmoidType; 4 fn sigmoid(&self) -> Self::SigmoidType; 5 6} 7 8impl<T: Float, U: Dimension > Sigmoid for Array<T, U> { 9 type SigmoidType = Array<T, U>; 10 fn sigmoid(&self) -> Self::SigmoidType { 11 let ones = Array::ones(self.shape()); 12 let nimus = Array::zeros(self.shape()) - self; 13 ones / (ones + nimus.exp()) 14 } 15}
このような実装を行なったところ以下のようなエラーを得ました。
error[E0308]: mismatched types --> src/func.rs:30:9 | 25 | impl<T: Float, U: Dimension > Sigmoid for Array<T, U> { | - this type parameter ... 30 | ones / (ones + nimus.exp()) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter `U`, found struct `Dim` | = note: expected struct `ArrayBase<OwnedRepr<T>, U>` found struct `ArrayBase<OwnedRepr<_>, Dim<IxDynImpl>>` error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0308`. error: could not compile `rust_machine_learning` To learn more, run the command again with --verbose.
このエラーでは、onesやzerosで生成したArrayのデータ型が異なるというエラーだと考えています。
入力(type SigmoidType
)はArrayBase<T: Float, U: Dimension>
で、onesで生成されるデータ型はArray<T: Float, U: Dim<IdDynImpl>>
の形になっています。
私は、できれば、データ型を変えずに(Array<T:Float, U: Dimension>
)演算を行いたいと考えています。そのような方法は存在するかを伺いたいです。または、根本的に実装方法が悪いのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/31 08:12