我正在尝试使用Keras中的Functional API创建具有以下结构的多输入模型:
有三个输入:Team_1_In
,Team_2_In
,Home_In
。其中Team_1_In
和Team_2_In
穿过Embedding
层,然后是BatchNormalization
和Flatten
层。问题是当我尝试在Flatten
之后添加BatchNormalization
层时出现此错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last) <ipython-input-46-8354b255cfd1> in <module>
15 batch_normalization_2 = BatchNormalization()(team_2_strength)
16
---> 17 flatten_1 = Flatten()(batch_normalization_1)
18 flatten_2 = Flatten()(batch_normalization_2)
19
~/conda/lib/python3.6/site-packages/keras/engine/topology.py in
__call__(self, inputs, **kwargs)
573 # Raise exceptions in case the input is not compatible
574 # with the input_spec specified in the layer constructor.
--> 575 self.assert_input_compatibility(inputs)
576
577 # Collect input shapes to build layer.
~/conda/lib/python3.6/site-packages/keras/engine/topology.py in assert_input_compatibility(self, inputs)
488 self.name + ': expected min_ndim=' +
489 str(spec.min_ndim) + ', found ndim=' +
--> 490 str(K.ndim(x)))
491 # Check dtype.
492 if spec.dtype is not None:
ValueError: Input 0 is incompatible with layer flatten_10: expected min_ndim=3, found ndim=2
我尝试使用BatchNormalization
层的轴参数,但没有帮助。这是我的代码:
# create embedding layer
from keras.layers import Embedding
from keras.layers import BatchNormalization, Flatten, Dense
from numpy import unique
# Create an embedding layer
team_lookup = Embedding(input_dim=n_teams,
output_dim=1,
input_length=1,
name='Team-Strength')
# create model with embedding layer
from keras.layers import Input, Embedding, Flatten
from keras.models import Model
# Create an input layer for the team ID
teamid_in = Input(shape=(1,))
# Lookup the input in the team strength embedding layer
strength_lookup = team_lookup(teamid_in)
# Flatten the output
strength_lookup_flat = Flatten()(strength_lookup)
# Combine the operations into a single, re-usable model
team_strength_model = Model(teamid_in, strength_lookup_flat, name='Team-Strength-Model')
# Create an Input for each team
team_in_1 = Input(shape=(1,), name='Team-1-In')
team_in_2 = Input(shape=(1,), name='Team-2-In')
# Create an input for home vs away
home_in = Input(shape=(1,), name='Home-In')
# Lookup the team inputs in the team strength model
team_1_strength = team_strength_model(team_in_1)
team_2_strength = team_strength_model(team_in_2)
batch_normalization_1 = BatchNormalization()(team_1_strength)
batch_normalization_2 = BatchNormalization()(team_2_strength)
flatten_1 = Flatten()(batch_normalization_1)
flatten_2 = Flatten()(batch_normalization_2)
# Combine the team strengths with the home input using a Concatenate layer, then add a Dense layer
out = Concatenate()([flatten_1, flatten_2, home_in])
out = Dense(1)(out)
python大神给出的解决方案
如错误所示,Flatten层需要3D张量:
ValueError: Input 0 is incompatible with layer flatten_10: expected min_ndim=3, found ndim=2
在代码的第一部分中,您将输入传递给了嵌入层,一切都很好,并且编译成功:
team_lookup = Embedding(input_dim=1,
output_dim=1,
input_length=1,
name='Team-Strength')
strength_lookup = team_lookup(teamid_in)
batch_normalization_1 = BatchNormalization()(strength_lookup)
strength_lookup_flat = Flatten()(batch_normalization_1)
team_strength_model = Model(teamid_in, strength_lookup_flat, name='Team-Strength-Model')
team_strength_model.compile(optimizer='adam', loss='categorical_crossentropy')
但是在第二部分代码中,您将输入传递给team_strength_model
,从而拉平了将其形状转换为(batch, flatten)
的张量。当您将此2D张量传递给BatchNormalization
时,它将引发此类异常。
要解决此问题:
1)将输入传递到Embedding
层
2)做BatchNormalization
3)展平BatchNormalization
的输出
我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…
keras中的自定义RMSPE损失函数 - python我正在尝试在keras中定义我自己的损失函数,即均方根百分比误差。 RMSPE定义为:我已经将损失函数定义为:from keras import backend as K def rmspe(y_true, y_pred): sum = K.sqrt(K.mean(K.square( (y_true - y_pred) / K.clip(K.abs(y_tr…
Python pytz时区函数返回的时区为9分钟 - python由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…
用大写字母拆分字符串,但忽略AAA Python Regex - python我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…
如何打印浮点数的全精度[Python] - python我编写了以下函数,其中传递了x,y的值:def check(x, y): print(type(x)) print(type(y)) print(x) print(y) if x == y: print "Yes" 现在当我打电话check(1.00000000000000001, 1.0000000000000002)它正在打印:<…