Merge pull request #50 from alha02/add-more-tf-ops

Add more tf ops
This commit is contained in:
Mike J Innes 2017-08-17 21:47:47 +01:00 committed by GitHub
commit f5b41d2e89
4 changed files with 46 additions and 1 deletions

View File

@ -23,7 +23,7 @@ include("core.jl")
import .FluxCore: back!, update!, graph
include("utils.jl")
include("ops.jl")
include("params.jl")
include("compiler/code.jl")

View File

@ -31,6 +31,15 @@ graph(::typeof(svd), x) = svd(x)
graph(::typeof(size), x, dim) = TensorFlow.size(x,convert(Tensor{Int32}, dim))
graph(::typeof(size), x) = TensorFlow.size(x)
graph(::typeof(chol), args...) = TensorFlow.transpose(TensorFlow.cholesky(args...))
graph(::typeof(reshape), x, dims) = TensorFlow.reshape(x,convert(Tensor{Int32},dims))
graph(::typeof(Flux.tile), args...) = TensorFlow.tile(args...)
graph(::typeof(fill), x, dims) = Ops.fill(convert(Tensor{Int32}, dims), Tensor(x))
graph(::typeof(Flux.cast), args...) = TensorFlow.cast(args...)
graph(::typeof(solve), A, b) = TensorFlow.matrix_solve(A, b)
graph(::typeof(triangular_solve), A, b) = TensorFlow.matrix_triangular_solve(A, b; lower=false)
graph(::typeof(randu), x) = Ops.random_uniform(convert(Tensor{Int32},x);dtype=Float32)
graph(::typeof(randn), x) = TensorFlow.random_normal(convert(Tensor{Int32},x);dtype=Float32)
graph(::typeof(Flux.expand_dims), x, dim) = TensorFlow.expand_dims(x,convert(Tensor{Int32},dim))
for op in (*, .*, .+, .^, log, exp, ceil, floor, sqrt, abs, cos,
sin, tan, atan, asin, acos, tanh, lgamma, erf, erfc, real, imag, conj,

18
src/ops.jl Normal file
View File

@ -0,0 +1,18 @@
export reshape, tile, fill, cast, solve, triangular_solve, randu, randn,
expand_dims
import Base: reshape, fill, randn
reshape(x::AbstractArray, dims::AbstractArray) = reshape(x,tuple(dims...))
tile(x::AbstractArray, mult::AbstractArray) = repeat(x,outer=tuple(mult...))
fill{T}(x::T, dims::AbstractArray) = fill(x,tuple(dims...))
cast{T}(x::AbstractArray, ::Type{T}) = convert(Array{T},x)
solve(A::AbstractArray, b::AbstractArray) = A\b
triangular_solve(A::AbstractArray, b::AbstractArray) = A\b
randu(x::AbstractArray) = rand(tuple(x...))
randn(x::AbstractArray) = randn(tuple(x...))
function expand_dims(x,dim)
s = [size(x)...]
reshape(x,tuple(vcat(s[1:dim-1],1,s[dim:end])...))
end

View File

@ -47,6 +47,24 @@ end
A = randn(6,5)
A = A'*A
@test tf(@net x -> chol(x))(A) chol(A)
A = randn(Float32,(6,3))
@test transpose(tf(@net (x,y) -> reshape(x,y))(transpose(A),[2,9])) reshape(A,(9,2)) # Note: TF is row major and julia is not
A = randn(Float32,(4,3,1))
@test tf(@net (x,y) -> Flux.tile(x,y))(A,[1,1,3]) repeat(A,outer=(1,1,3))
@test tf(@net (x,y) -> fill(x,y))(3.2,[3,2]) convert(Array{Float32},3.2*ones(3,2))
@test typeof(tf(@net x -> Flux.cast(x,Int32))(A)) == Array{Int32,3}
A = randn(Float32,(5,5))
b = randn(Float32,(5,1))
@test tf(@net (x,y) -> solve(x,y))(A,b) A\b
_,A,_ = lu(A)
@test tf(@net (x,y) -> triangular_solve(x,y))(A,b) A\b
@test size(tf(@net x -> randu(x))([2,3])) == (2,3)
@test size(tf(@net x -> randn(x))([2,3])) == (2,3)
m = tf(@net (x,y) -> Flux.expand_dims(x,y))
A = randn(Float32,(3,2))
@test m(A,1) Flux.expand_dims(A,1)
@test m(A,2) Flux.expand_dims(A,2)
@test m(A,3) Flux.expand_dims(A,3)
end
end