ScalaTestのDeeplearning4jのテストを簡単にしたい

Deeplearning4jのNDArray同士をアバウトに比較したい

scala> import org.nd4j.linalg.factory.Nd4j
import org.nd4j.linalg.factory.Nd4j
scala> val a = Nd4j.create(Array(1.0, 2.0))
a: org.nd4j.linalg.api.ndarray.INDArray = [    1.0000,    2.0000]
scala> val b = Nd4j.create(Array(1.1, 1.9))
b: org.nd4j.linalg.api.ndarray.INDArray = [    1.1000,    1.9000]
scala> a == b
res0: Boolean = false

当然数値で比較するとfalseなわけですが,これをちょっとくらいの誤差だったらtrueでイコールとみなすようなことをしたいです.

Scalacticを使う

まさのそのためのライブラリがあります.

Scalactic

The Scalactic library is focused on constructs related to quality that are useful in both production code and tests. Although ScalaTest is tightly integrated with Scalactic, you can use Scalactic with any Scala project and any test framework. The Scalactic library has no dependencies other than Scala itself.


Scalaticライブラリは高品質なコードのためのもので,プロダクションコードとテストの両方にとって有益です.ScalaTestはScalaticと統合されているので,Scalaのプロジェクトとあらゆるテストフレームワークにおいて利用することができます.ScalaticライブラリはScala自身以外への依存はありません.

Tolerance

まず,Tolerance(耐性,許容)を使って数値をアバウトに比較できるようにします.
[ 1.0000, 2.0000]と[ 1.1000, 1.9000]が等しくなるようにしたい.まずは1.0と1.1が等しかったり,2.0と1.9が等しかったりするようにします.

scala> import org.scalactic._
import org.scalactic._
scala> import TripleEquals._
import TripleEquals._
scala> import Tolerance._
import Tolerance._

scala> val a = 1.0
a: Double = 1.0
scala> val b = 2.0
b: Double = 2.0

scala> a === 1.1 +- 0.1
res3: Boolean = true
scala> b === 1.9 +- 0.1
res4: Boolean = true

なんと簡単.===じゃないとダメです.==ならこうなります.

scala> a == 1.1 +- 0.1
<console>:23: warning: comparing values of types Double and org.scalactic.TripleEqualsSupport.Spread[Double] using `==' will always yield false
       a == 1.1 +- 0.1
         ^

型が違うので等しいとは判断されないということです.
この辺りの説明はオフィシャルドキュメントにあります.
https://www.scalactic.org/user_guide/Tolerance

ただ,いちいち+-を使って誤差許容範囲を書くのはめんどくさい.scalaのimplicitを使うとこう書けます.

scala> import org.scalactic.TolerantNumerics
import org.scalactic.TolerantNumerics
scala> val epsilon = 1e-1
scala> implicit val doubleEq = TolerantNumerics.tolerantDoubleEquality(epsilon)
doubleEq: org.scalactic.Equality[Double] = TolerantDoubleEquality(0.1)

scala> a === 1.1
res6: Boolean = true

この場合,誤差範囲が0.1より大きくなると等しくなくなります.

scala> a === 1.2
res9: Boolean = false

目的は数値同士の比較ではなく,NDArrayのベクトルなり行列なりを比較することなので,もう少し拡張します.

Equality

Equalityを使って,ベクトル同士をどう比較するかを定義します.通常の比較だとベクトルの各成分を==で比較しますが,それを変更し,ベクトルの各成分をTolerance付きの===で比較するように変更すれば良さそうです.

scala>  import org.scalactic._
import org.scalactic._

scala> import TripleEquals._
import TripleEquals._

scala>  import Tolerance._
import Tolerance._

scala> import org.scalactic.TolerantNumerics
import org.scalactic.TolerantNumerics

scala> val epsilon = 1e-1
epsilon: Double = 0.1

scala> implicit val doubleEq = TolerantNumerics.tolerantDoubleEquality(epsilon)
doubleEq: org.scalactic.Equality[Double] = TolerantDoubleEquality(0.1)

scala> import org.scalactic.Equality
import org.scalactic.Equality

scala> import org.nd4j.linalg.api.ndarray.INDArray
import org.nd4j.linalg.api.ndarray.INDArray

scala> implicit val ndarrayEq =
     |   new Equality[INDArray] {
     |     def areEqual(a: INDArray, b: Any): Boolean =
     |       b match {
     |         case p: INDArray =>  a.shape === p.shape &&
     |             (0L until a.shape()(0)).map(f =>
     |               a.getDouble(f) === p.getDouble(f))
     |             .foldLeft(true)((g,h) => g && h)
     |         case _ => false
     |       }
     |
     |   }
ndarrayEq: org.scalactic.Equality[org.nd4j.linalg.api.ndarray.INDArray] = $anon$1@5c5bf478
scala>  import org.nd4j.linalg.factory.Nd4j
import org.nd4j.linalg.factory.Nd4j

scala> val a = Nd4j.create(Array(1.0, 2.0))
log4j:WARN No appenders could be found for logger (org.nd4j.linalg.factory.Nd4jBackend).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
a: org.nd4j.linalg.api.ndarray.INDArray = [    1.0000,    2.0000]

scala> val b = Nd4j.create(Array(1.1, 1.9))
b: org.nd4j.linalg.api.ndarray.INDArray = [    1.1000,    1.9000]

scala> a === b
res0: Boolean = true

Equalityについては,オフィシャルドキュメントに説明があります.
https://www.scalactic.org/user_guide/CustomEquality


一応イケたんですが,1次元ベクトルしか対応していないので,行列やテンソルに拡張するにはもう少し改良が必要です.

WF-XB700を買った

f:id:tullio:20210113215137j:plain:w300

久しぶりにソニー製のオーディオ製品を買いました.

WF-XB700 | ヘッドホン | ソニー

完全ワイヤレスで,1万円とか2万円の安い値段帯のものを探していました.走る時に使いたかったので,音質やノイズキャンセリングは二の次で,自分の耳にフィットするものを探していました.どの製品を試しても耳からスカッと取れる感じでランニング時には使えないなーという感じだったのですが,この製品だけ,耳にはめてぐるっと回すと,妙にピッタリとハマったので即買いしました.
毎日,走る時に使ったり,通勤など電車に乗る時に使っていても,取れたり落ちたりすることはありません.「クイック充電にも対応しており、10分の充電で60分再生可能」というのも良いです.

なお,以前に買ったソニーのオーディオ製品は,ソニーのマイページによると次のようなものでした.

NW-E040シリーズ | ポータブルオーディオプレーヤー WALKMAN ウォークマン | ソニー
これも軽かったし,本体にUSBオス端子が付いていて,直接パソコンにぶっ刺してファイルのやり取りができるのが便利でした.

NW-M500シリーズ | ポータブルオーディオプレーヤー WALKMAN ウォークマン | ソニー
これはノイズキャンセリングが秀逸で,通勤時に相当お世話になりました.

AirPodsも考えたのですが,やっぱり走ると吹っ飛びそうな感じがしたので止めました.今のところ,WF-XB700がとっても気に入っています.

FIT2018 第17回情報科学技術フォーラム

もう17回なんですね.
FIT2018

日記に付けてるだけで,何回通ってることでしょう.

少なくとも10年以上前から記録がありました.

FIT2006 続報 - なぜか数学者にはワイン好きが多い
FIT2006
当時は,数値計算の研究が自分の中ではメインだったようです.

自分の研究発表については触れていませんが,さらに前の参加の記録もたくさん出てきました.例えば.

FIT2005 その後 - なぜか数学者にはワイン好きが多い
...と思ってリンクをたどってみると,神田さんの資料へのリンクが生きてる!
神田さんのセカンドライフVRへの熱い想いが溢れてる資料が生きてますね.凄い.

私自身は,機械学習関連のセッションで講演をしました.

とっても嬉しかったことは,恩人の山澤先生に偶然に(いや,偶然では無いだろう...)御挨拶できたことでした.
福岡工業大学|研究者情報|プロフィール

山澤先生が九州の大学に移られたことは当然知っていたのですが,FIT(福岡工業大学)だったとは記憶していず,自ら御挨拶に行かなくて大変失礼致しました.
たまたま,IBIS/CVIM/PRMUのFIT内研究会に行った時に,FIT参加者だと通常有料の原稿にアクセス出来ると聞いて確認に行くと,バッタリと
山澤先生にお会いしました.というか先生が現地委員長だったので,うろついていて頂いていたのが当然でした.
お疲れさまでした!FIT/研究会の両方の現地担当だったんですね.丁寧に御挨拶ができなくて申し訳ないです.
次の情報処理学会全国大会も九州ですよね?また遊びに行きますので,よろしくお願い致します!

東急ステイ博多


とてつもないホテルでした!
連泊だと部屋の清掃が無いなどの但書でしたが,備品の清掃交換などは行ってくれて,部屋も広くて綺麗で,荷物の預かりもしてくれて(博多駅に凄く近いので,コインロッカーを使うよりも便利でした)良かったです.部屋に備え付けの全自動洗濯機も静かでびっくりでした.あと,ホテルの方が,みなさん態度が丁寧.
具体額は書きませんがお値段も格安でした.お世話になりました.ありがとうございます.

冷蔵庫は電源がオンに最初からなっていましたし,部屋にコンセントプラグがあちこちにあり,使いませんでしたがコンセントの隣にUSBプラグもあり,ドライヤーの出力も強いしとっても良いビジネスホテルでした.

Workshop on Functional Inference and Machine Intelligence (FIMI)

多分,7年ぶりくらいに統計数理研究所に行って来ました.

前に行ったのは,多分このとき.
阪神大震災から16年後の再び体験. - なぜか数学者にはワイン好きが多い
前まではバスを使ったり立川駅から徒歩で行ったりしてたのですが,今回は多摩モノレール立川駅から高松駅に移動して,駅から研究所まで歩いて通いました.
本数も多いし,これが一番ラクな気がしました.

行った目的は,こちらのワークショップに参加するためです.
Workshop on Functional Inference and Machine Intelligence


こんな感じに参加者が溢れていました.参加者が多くて,秘書さんの方々も相当に苦労なさってたようです.

講演内容は日によってある程度のジャンル分けがされていて,位相的データ解析の講演があったりカーネル法の講演の日があったり深層学習の講演があったりと盛りだくさんでした.

こんな感じにホワイトボードを使って説明を始める講演者の方もいました.

建物の前に雪があって,会議の期間中,結構寒かったので西東京では雪が残っているのかと思って写真を撮ったのですが...

そのことを知人に話していて思ったのですが,いくらなんでも雪が降ってからは期間があるので,ひょっとしたら統計数理研究所の隣の
国立極地研究所で何かやっていたのかもしれません.




3日間通ったのですが,取り敢えず,今回は無事に帰宅できて本当に良かったです.

立川市役所レストラン

統計数理研究所には何度も来ているのですが,昔は昼食を取るという習慣が無かったので,今回は初めて昼飯を食べました.
研究所で売っているお弁当や裁判所の地下の食堂も興味があったのですが,取り敢えず立川市役所の3階のレストランに来てみました.

それほど混んでもいなく,食券を買って頼んでからの時間もかからず,値段も安くてとても良かったです.
味は,本当に普通の食堂やレストランという感じでした.

写真は,ハーフ&ハーフです.
『ミートソースはドミグラスソース』by ちー&りー : 立川市役所 レストラン - 砂川七番/社員食堂 [食べログ]
なお,ラーメンもチャーハンセットで食ってみましたが普通でした.

『市役所食堂のラーメンを頂きました!素朴で美味かった♪』by はぴ☆ぱら なおりん : 立川市役所 レストラン - 砂川七番/社員食堂 [食べログ]
普段,職場近くで御飯を食べている感覚だと,普通じゃないのはお値段です.
セット系の,単品の1.5倍くらいのボリュームのメニューは,500円台でした.安い.


1階にあるレストランも美味しそうだったのですが,入り口から入ってすぐに見えるところで落ち着か無さそうだったので,次回にすることにしました...

そんな気を使わなくてもいいから,話し掛けなくてもいいから,確認だけして頂ければ(ノートPCを破壊されかかった)

https://note.mu/ayaniememo/n/ne5143a03b56d

「イス倒していいですか」文化を本当に撲滅したい

私は毎月新幹線に5,6回乗る生活をしています。
よく新幹線では「シートを倒す時は後ろのお客様にご配慮の上」と流れます。

椅子に全席リクライニング機能が付いていますが「倒していいですか?」と聞かなければならないという圧を、これを聞くたびに私は感じていて。

この話をすると、海外からの友人は「相手思いだね?」というポジティブな反応も多いし
「なんか面倒だね。全員に与えられた当たり前の権利なのに」「Too muchじゃないの?」と言った感想をよく聞きます。

海外では倒していいですか?なんて聞く人はいません。日本ならではの独自な文化です。

新幹線で,シートの前のテーブルにノートPCを置いていたら,もんの凄いガクッと前の方がシートを倒してきて,ノートPCの液晶パネルが上下に挟まれて押し込まれて破壊されそうになったことがありました.とっさに引っ張って逃れましたが,40万円のパソコンが破壊されるところでした.
それ以来,前の座席の人が急に動き出すとドキドキします.

後ろの方が何もしていなければ気を使わずに存分に倒しても良いかと思いますが,テーブルを使っているようでしたら,気付いて頂けるとドキドキが減ります.

「「イス倒していいですか」文化を本当に撲滅したい」という極論でネタを取る文化を撲滅したいです.

加藤 綾(あやにー)

2018/01/26 16:10

みなさんこんにちは、あやにーです。
今タイに向かう飛行機の中で書いています。

良い身分ですなー