Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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 如何正确连接Keras中的致密层和Lambda层?_Python_Machine Learning_Keras_Keras Layer - Fatal编程技术网

Python 如何正确连接Keras中的致密层和Lambda层?

Python 如何正确连接Keras中的致密层和Lambda层?,python,machine-learning,keras,keras-layer,Python,Machine Learning,Keras,Keras Layer,我在用Keras。在以下代码中,模型将[a0,a1],[b0,b1,b2]作为输入,并将[a0*b0,a0*b1,a0*b2,a1*b0,a1*b1,a1*b2]作为输出: from keras import backend as K from keras.models import Model from keras.models import Input from keras.layers import Dense def mix(ts): t0 = K.expand_dims(ts

我在用Keras。在以下代码中,
模型
[a0,a1]
[b0,b1,b2]
作为输入,并将
[a0*b0,a0*b1,a0*b2,a1*b0,a1*b1,a1*b2]
作为输出:

from keras import backend as K
from keras.models import Model
from keras.models import Input
from keras.layers import Dense

def mix(ts):
    t0 = K.expand_dims(ts[0], axis=-1)
    t1 = K.expand_dims(ts[1], axis=1)
    return K.batch_flatten(t0 * t1)

a = Input(shape=(2,))
b = Input(shape=(3,))
c = Lambda(mix)([a, b])

model = Model(inputs=[a,b], outputs=c)
以下是测试:

u = np.array([1,2]).reshape(1,2)
v = np.array([3,4,5]).reshape(1,3)
print(model.predict([u,v]))
[[3.4.5.6.8.10.]

但如果我尝试将
Dense
层连接到
Lambda
层,我会得到一个错误:

from keras import backend as K
from keras.models import Model
from keras.models import Input
from keras.layers import Dense

def mix(ts):
    t0 = K.expand_dims(ts[0], axis=-1)
    t1 = K.expand_dims(ts[1], axis=1)
    return K.batch_flatten(t0 * t1)

a = Input(shape=(2,))
b = Input(shape=(3,))
c = Lambda(mix)([a, b])
d = Dense(2)(c)

model = Model(inputs=[a,b], outputs=d)
下面是我得到的错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-0f7f977a1e79> in <module>()
      7 b = Input(shape=(3,))
      8 c = Lambda(mix)([a, b])
----> 9 d = Dense(2)(c)
     10 
     11 model = Model(inputs=[a,b], outputs=d)

~\Anaconda3\envs\mind\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs)
    429                                          'You can build it manually via: '
    430                                          '`layer.build(batch_input_shape)`')
--> 431                 self.build(unpack_singleton(input_shapes))
    432                 self.built = True
    433 

~\Anaconda3\envs\mind\lib\site-packages\keras\layers\core.py in build(self, input_shape)
    864                                       name='kernel',
    865                                       regularizer=self.kernel_regularizer,
--> 866                                       constraint=self.kernel_constraint)
    867         if self.use_bias:
    868             self.bias = self.add_weight(shape=(self.units,),

~\Anaconda3\envs\mind\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name + '` call to the ' +
     90                               'Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

~\Anaconda3\envs\mind\lib\site-packages\keras\engine\base_layer.py in add_weight(self, name, shape, dtype, initializer, regularizer, trainable, constraint)
    247         if dtype is None:
    248             dtype = K.floatx()
--> 249         weight = K.variable(initializer(shape),
    250                             dtype=dtype,
    251                             name=name,

~\Anaconda3\envs\mind\lib\site-packages\keras\initializers.py in __call__(self, shape, dtype)
    207             scale /= max(1., fan_out)
    208         else:
--> 209             scale /= max(1., float(fan_in + fan_out) / 2)
    210         if self.distribution == 'normal':
    211             # 0.879... = scipy.stats.truncnorm.std(a=-2, b=2, loc=0., scale=1.)

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
7b=输入(形状=(3,))
8 c=λ(混合物)([a,b])
---->9 d=密度(2)(c)
10
11模型=模型(输入=[a,b],输出=d)
~\Anaconda3\envs\mind\lib\site packages\keras\engine\base\u layer.py在调用中(self,input,**kwargs)
429'您可以通过以下方式手动构建它:'
430'`layer.build(批处理输入形状)`)
-->431自构建(解包单例(输入形状))
432自建=真
433
~\Anaconda3\envs\mind\lib\site packages\keras\layers\core.py内置(self,input\u shape)
864 name='kernel',
865正则化器=self.kernel\u正则化器,
-->866约束=self.kernel\u约束)
867如果自我使用偏差:
868 self.bias=self.add_权重(形状=(自身单位,),
包装中的~\Anaconda3\envs\mind\lib\site packages\keras\legacy\interfaces.py(*args,**kwargs)
89 warnings.warn('Update your`'+object\u name+'`调用+
90'Keras 2 API:'+签名,堆栈级别=2)
--->91返回函数(*args,**kwargs)
92包装器._原始函数=func
93返回包装器
添加权重中的~\Anaconda3\envs\mind\lib\site packages\keras\engine\base\u layer.py(self、name、shape、dtype、initializer、regularizer、trainable、constraint)
247如果数据类型为无:
248 dtype=K.floatx()
-->249重量=K.变量(初始值设定项(形状),
250数据类型=数据类型,
251 name=名称,
调用中的~\Anaconda3\envs\mind\lib\site packages\keras\initializers.py(self、shape、dtype)
207刻度/=最大值(1,扇出)
208其他:
-->209刻度/=最大值(1,浮动(扇形输入+扇形输出)/2)
210如果自分布=‘正常’:
211#0.879…=scipy.stats.truncnorm.std(a=-2,b=2,loc=0,scale=1。)
TypeError:不支持+:“NoneType”和“int”的操作数类型

如何将
密集
层正确连接到
Lambda
层?

在这种情况下,您需要设置
Lambda
层的输出形状,因为它无法自动推断。请手动传递
输出形状

c = Lambda(mix, output_shape=(6,))([a, b])
或者更好的方法是,传递一个函数,根据层的输入张量的形状计算输出形状:

def mix_output_shape(input_shape):
    # input_shape[0] is the shape of first input tensor
    # input_shape[1] is the shape of second input tensor
    return (input_shape[0][0], input_shape[0][1] * input_shape[1][1])

# ...
c = Lambda(mix, mix_output_shape)([a, b])