読者です 読者をやめる 読者になる 読者になる

studylog/北の雲

chainer/python/nlp

chainerメモ6 float64 != float32 エラー

chainer使ってて遭遇したエラー文をwebに上げて同じように遭遇した人がすぐ解決出来るようにしたいのでどんどん書いていく。

chainer.utils.type_check.InvalidType: Expect: in_types[0].dtype == in_types[1].dtype
Actual: float64 != float32

よく遭遇する型エラー。
chainerはfloat32しか扱わないけどfloat64が紛れ込んでますよ、ということだと思う。

実例

accum_loss = Variable(np.zeros(())) #loss値を0で初期化

loss_i = model.forward(~~ ) #学習してloss_iが返って来る

accum_loss += loss_i

ここで上記のエラーが出る。
この場合accum_lossがfloat64でloss_iはfloat32になってしまっている。

なのでこうする。

accum_loss = Variable(np.zeros(())) #これじゃダメfloat64になってしまう
accum_loss = Variable(np.zeros(()).astype(np.float32)) #明示的にfloat32を指定

GPUではエラーでなかったのにCPUで出る場合

ずっとGPUで動かしていたコードをCPUで動かそうとすると上記のエラーが出たりする。

#GPU
accum_loss = Variable(cuda.zeros(()))
#CPU
accum_loss = Variable(np.zeros(()))

どこかの分岐でこうなってるはずで、cuda.zeros()はastypeを付けなくてもfloat32になってくれるんじゃなかろうか?今検証する気力が無いので推測。