Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在我的层中找到不可微运算?_Python_Tensorflow_Keras_Keras Layer_Differentiation - Fatal编程技术网

Python 如何在我的层中找到不可微运算?

Python 如何在我的层中找到不可微运算?,python,tensorflow,keras,keras-layer,differentiation,Python,Tensorflow,Keras,Keras Layer,Differentiation,我试图创建一个相当复杂的lambda层,在keras中有许多操作。在我实现它之后,我得到了一个ValueError:没有为任何变量提供梯度 虽然我只使用keras操作来转换数据(除了我使用numpy创建的常数,稍后我将其添加到张量中),但我知道一定有一些操作是不可微的。现在,我想知道如何找出它是哪一个,以便找到解决方法 我还不想发布任何代码,因为这是竞争的一部分,我想自己解决这个问题。如果因为这个原因我很难理解我的问题,请让我知道。但是,我可以列出我正在使用的所有功能: 从tensorflow.

我试图创建一个相当复杂的lambda层,在keras中有许多操作。在我实现它之后,我得到了一个
ValueError:没有为任何变量提供梯度

虽然我只使用keras操作来转换数据(除了我使用numpy创建的常数,稍后我将其添加到张量中),但我知道一定有一些操作是不可微的。现在,我想知道如何找出它是哪一个,以便找到解决方法

我还不想发布任何代码,因为这是竞争的一部分,我想自己解决这个问题。如果因为这个原因我很难理解我的问题,请让我知道。但是,我可以列出我正在使用的所有功能:

从tensorflow.keras导入后端为K
从tensorflow.python.keras.layers导入Lambda
...
定义my_lambda_函数(x):
#用途:
K.批处理
K.卡斯特
K.夹子
串联
K.1_热
重塑
K.sum
K.tile#仅适用于在numpy中创建的常量
...
#在这样的模型中使用函数:
my_lambda_layer=lambda(my_lambda_函数)
结果张量=我的lambda层(一些输入)

我认为K.one_hot可能会有问题,但我想知道一种方法,在我尝试在几个小时的睡眠后使其可区分之前,这里是我的简单解决方案:创建一个用于测试的简单NN,并添加一个lambda层,在其中我分别尝试所有函数。然而,这只是发现问题的间接方法。这是我的密码:

从tensorflow.python.keras.layers导入输入、Conv2D、maxpoolig2d、UpSampling2D、Conv2DTranspose、Lambda
从tensorflow.python.keras.models导入
从tensorflow.keras.datasets.mnist导入加载数据
从tensorflow.keras导入后端为K
导入tensorflow作为tf
将numpy作为np导入
(x_列,y_列),(x_测试,y_测试)=负载数据()
x_系列,x_测试=x_系列/255.0,x_测试/255.0
x_序列,x_测试=np.整形(x_序列,(-1,28,28,1)),np.整形(x_测试,(-1,28,28,1))
def测试_功能(x):
x_int=K.cast(x,tf.int16)#这是我案例中的梯度杀手之一
返回K.cast(x_int,tf.float16)
模型=顺序()
添加(输入(shape=(28,28,1)))
添加(Conv2D(10,(5,5),padding='same',activation='relu'))
model.add(MaxPooling2D())
模型添加(Lambda(测试函数))
model.add(UpSampling2D())
add(conv2dtranspase(4,(5,5),padding='same',activation='relu'))
add(conv2dtranspase(1,(3,3),padding='same',activation='sigmoid'))
model.compile(优化器='adam',
损失='mse',
指标=[‘准确度’])
模型拟合(x_序列,x_序列,历元=5)
模型评估(x_检验,x_检验)
这对我很有效,但我希望有更好的解决方案

顺便说一句,我可以使用以下函数近似地板操作(这也会消除梯度):

defa(x):
2_pi=2*math.pi
双πx=x*双π
正弦=K.sin(二πx)
分子=正弦+2πx
返回分子/2_π
def近似楼层(x):
x2=a(a(a(x))-0.5
返回x2

信息不足,无法给出正确答案。使用
one\u hot
这一事实意味着您正在处理离散数据,而这通常是不可微的。我正在创建一个层,该层应用一种基于最后一层位置输出向量的向量。因此,我需要一个_hot将输出向量映射到一个矩阵,然后将它与另一个相乘。不过,近似值也不错,因为离散化当然会消除梯度。我想tensorflow可能会近似于这些操作的梯度。