我已经在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] .
我知道 g
和 v
是张量,可能需要将其展平为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]具有负维度[[Node:dense_4_input = Placeholderdtype = DT_FLOAT,shape = [?,784],_ device =“/ job:localhost / replica:0 / task:0 / GPU:0" ]]
非常感谢您的帮助