using Flux, CuArrays, Test # @testset "RNN" begin # @testset for R in [RNN, GRU, LSTM] # rnn = R(10, 5) # curnn = mapleaves(gpu, rnn) # @testset for batch_size in (1, 5) # Flux.reset!(rnn) # Flux.reset!(curnn) # x = batch_size == 1 ? # param(rand(10)) : # param(rand(10,batch_size)) # cux = gpu(x) # y = (rnn(x); rnn(x)) # cuy = (curnn(cux); curnn(cux)) # # @test y.data ≈ collect(cuy.data) # @test haskey(Flux.CUDA.descs, curnn.cell) # # Δ = randn(size(y)) # # Flux.back!(y, Δ) # Flux.back!(cuy, gpu(Δ)) # # @test x.grad ≈ collect(cux.grad) # @test rnn.cell.Wi.grad ≈ collect(curnn.cell.Wi.grad) # @test rnn.cell.Wh.grad ≈ collect(curnn.cell.Wh.grad) # @test rnn.cell.b.grad ≈ collect(curnn.cell.b.grad) # @test rnn.cell.h.grad ≈ collect(curnn.cell.h.grad) # if isdefined(rnn.cell, :c) # @test rnn.cell.c.grad ≈ collect(curnn.cell.c.grad) # end # # Flux.reset!(rnn) # Flux.reset!(curnn) # ohx = batch_size == 1 ? # Flux.onehot(rand(1:10), 1:10) : # Flux.onehotbatch(rand(1:10, batch_size), 1:10) # cuohx = gpu(ohx) # y = (rnn(ohx); rnn(ohx)) # cuy = (curnn(cuohx); curnn(cuohx)) # # @test y.data ≈ collect(cuy.data) # end # end # end