在Keras(tf后端)中返回标量点积真的难吗?

Nic*_*las 6 python numpy keras tensorflow tensor

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

我正在使用自定义优化程序运行mnist mlp示例,目前该示例仅是来自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])
Run Code Online (Sandbox Code Playgroud)

现在,在我的自定义优化器中,我需要计算梯度与速度的点积,即在optimizers.py中的第168行之后,我需要类似于

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

不幸的是,以上所有工作均不成功,我只是得到了错误

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

据我所知,gv为这或许可能需要被压平,以numpy的阵列,以使用numpy的的点积张量。

我最接近的是通过检查optimizers.py中的第75行,该行计算渐变的范数,即

norm = K.sqrt(sum([K.sum(K.square(g)) for g in grads]))
Run Code Online (Sandbox Code Playgroud)

但是,即使如此,该声明

print(norm)

仍然返回张量!

同样,我也尝试过

angle = K.sum(g * v,axis=-1,keepdims=True)
Run Code Online (Sandbox Code Playgroud)

如此处建议的那样但结果仍然是张量,我无法将其解释为正确的:

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

当我尝试

print (K.get_value(angle)) 
Run Code Online (Sandbox Code Playgroud)

我刚得到

InvalidArgumentError(请参见上面的回溯):形状[-1,784]的尺寸为负[[节点:density_4_input = Placeholderdtype = DT_FLOAT,形状= [?, 784],_device =“ / job:localhost / replica:0 / task:0 / gpu:0“]]

非常感谢您的任何帮助

ros*_*fun 1

用于K.get_value(x)获取张量的标量。

tf.keras.backend.get_value