2017-07-11 1 views
0

SystemlMLのDMLで単純なhello worldニューラルネットワークを構築しようとしていますが、UDF関数から複数の値を返すことに固執しています。私はそれが正常に実行this codeに触発されてきたが、私は違いを把握することはできません。Apache SystemML DMLは関数内で複数の戻り値を許さない

script = """ 

# 
sigmoid = function(matrix[double] z) return (matrix[double] z) { 
    z = 1/(1+exp(-z)) 
} 


sigmoidPrime = function(matrix[double] z) return (matrix[double] z) { 
     #Gradient of sigmoid 
     z = exp(-z)/(1+exp(-z)) 
} 

X=matrix("3 5 5 1 10 2", rows=3, cols=2) 
inputLayerSize = 2 
outputLayerSize = 1 
hiddenLayerSize = 3 

W1 = rand(rows=inputLayerSize,cols=hiddenLayerSize) 
W2 = rand(rows=hiddenLayerSize,cols=outputLayerSize) 

feedForward = function (matrix[double] X, 
         matrix[double] W1, 
         matrix[double] W2) return (matrix[double] z3,matrix[double] Y) { 
    z2 = X %*% W1 
    a2 = sigmoid(z2) 
    z3 = (a2 %*% W2) 
    Y = sigmoid(z3) 
} 

#feedForward = function (matrix[double] X, 
#      matrix[double] W1, 
#      matrix[double] W2) return (matrix[double] z2,matrix[double] z3,matrix[double] Y) { 
# z2 = X %*% W1 
# a2 = sigmoid(z2) 
# z3 = a2 %*% W2 
# Y = sigmoid(z3) 
# z2,z3,Y 
#} 

#gradient = function(matrix[double] X, 
#      matrix[double] W1, 
#      matrix[double] W2, 
#      matrix[double] Y) return (matrix[double] Y) { 
# #Compute derivative with respect to W and W2 for a given X and y: 
# z2,z3,yHat = feedForward(X,W1,W2) 

# delta3 = -(Y-yHat) * sigmoidPrime(z3) 
# dJdW2 = t(a2) %*% delta3 

# delta2 = (delta3 %*% t(W2))*sigmoidPrime(z2) 
# dJdW1 = t(X) %*% delta2 

# return dJdW1, dJdW2 
#} 

Yhat=feedForward(X,W1,W2) 
nrx = nrow(X) 
ncx = ncol(X) 
nrw1 = nrow(W1) 
ncw1 = ncol(W1) 
""" 

私は

matrix[double] z3 
削除する場合:ベルトルト(フルコード)によって要求されるように

EDITを

それは動作しますが、そうでない場合は私が取得:

Caused by: org.apache.sysml.parser.LanguageException: ERROR: null -- line 22, column 0 -- Assignment statement cannot return multiple values

任意のアイデア?

答えて

1

SystemMLは、関数内で複数の戻り値をサポートしています。 http://apache.github.io/systemml/dml-language-reference.html#user-defined-function-udf

以下の例では、2つの行列を返します。

DMLstr = """ 
M1M2 = function(matrix[double] M) 
      return (matrix[double] M1, 
        matrix[double] M2) { 
    M1 = M + 1 
    M2 = M + 2 
} 

X=matrix("3 5 5 1 10 2", rows=3, cols=2) 
[M1, M2] = M1M2 (X) 
""" 

[M1, M2] = ml.execute(dml(DMLstr).output('M1', 'M2')).get('M1','M2') 

print M1.toNumPy() 
print M2.toNumPy() 

スニペットに「フィードフォワード」の呼び出しが表示されません。投稿できますか?

+0

呼び出しが間違っていた[Z3、YHAT] =フィードフォワード(X、W1、W2)が動作しますが、私はYHAT =フィードフォワード(X、W1、W2)を入れています –

0

"feedForward"の呼び出しは、出力に戻ると正しくありません。そのようなものに変更します。

[Yhat1, Yhat2]=feedForward(X,W1,W2)