在Keras(tf后端)返回标量点产品真的很难吗?

时间:2017-08-13 10:29:35

标签: python numpy tensorflow keras tensor

我已经在Keras issues上问了这个问题,但由于我在那里没有答案,所以我决定在这里试试运气。

我正在使用自定义优化器运行mnist mlp example,该优化器暂时只是来自optimizers.py的SGD副本,即

from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import Optimizer
from keras import backend as K
from legacy import interfaces
import numpy as np

class testsgd(Optimizer):
..... [everything same as sgd] .....

myopt = testsgd()

....[define model]....

model.compile(loss='categorical_crossentropy',
              optimizer=myopt,
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

现在,在我的自定义优化器中,我需要计算渐变的点积和速度,即在optimizers.py中的行168之后,我需要类似的东西

angle = K.dot(g,v) 要么 angle = K.dot(K.transpose(g),v) 要么 angle = K.dot(g, K.transpose(v))

不幸的是,上述工作都没有,我只是得到了错误

  

ValueError:Shape必须是等级2,但对于输入形状为'MatMul'(op:'MatMul')的等级为1:[512],[512]。

我知道gv是张量,可能需要展平为numpy数组,以便将numpy用于点积。

我最接近的是检查optimizers.py中的行75,它计算了渐变的范数,即

norm = K.sqrt(sum([K.sum(K.square(g)) for g in grads]))

然而,即便如此,声明

print(norm)

仍然会返回一个张量!

同样我也试过

angle = K.sum(g * v,axis=-1,keepdims=True)

按照建议here,但结果是张量,我无法解释为正确与否:

  

Tensor(“Sum_2:0”,shape =(1,),dtype = float32)

当我尝试

print (K.get_value(angle)) 

我得到了

  

InvalidArgumentError(参见上面的回溯):Shape [-1,784]具有负尺寸      [[节点:dense_4_input = Placeholderdtype = DT_FLOAT,shape = [?,784],_ device =“/ job:localhost / replica:0 / task:0 / gpu:0”]]

非常感谢您的任何帮助

1 个答案:

答案 0 :(得分:1)

使用K.get_value(x)获得张量的标量。

tf.keras.backend.get_value