我在Keras中创建了一个模型,如下所示:
m = Sequential() m.add(Dense(912, activation='relu', input_shape=(943, 1))) m.add(Dense(728, activation='relu')) m.add(Dense(528, activation='relu')) m.add(Flatten()) m.add(Dense(500, activation='relu', name="bottleneck")) m.add(Dense(528, activation='relu')) m.add(Dense(728, activation='relu')) m.add(Dense(943, activation='linear')) m.compile(loss='mean_squared_error', optimizer='SGD') m.summary()
现在我想将bottleneck
层添加到我下面的创建网络中:
model = Sequential() model.add(Dense(930, activation='relu', input_shape=(943, 1))) model.add(Flatten()) model.add(m.get_layer('bottleneck')) model.add(m.get_layer('bottleneck')) model.add(m.get_layer('bottleneck')) model.add(m.get_layer('bottleneck')) model.add(Flatten()) model.add(Dense(100, activation='linear'))
但是在训练模型m
之后,启动时引发了错误:
ValueError: Input 0 is incompatible with layer bottleneck: expected axis -1 of input shape to have value 497904 but got shape (None, 876990)
回答:
错误消息试图告诉你,在第二个模型中,你输入到’bottleneck’层的形状与第一个模型中的不同。
为了重用一个层,你需要匹配该层的输入数量。在你的情况下,第一个模型有497904个输入到该层,但你在下一模型中试图使用一个具有876990个输入的输入层。
我猜你可能想要这样的结构(注意,每次我都立即展平,这样我们可以更好地控制每一层的输入数量):
m = Sequential()m.add(Flatten(input_shape=(943, 1)))m.add(Dense(912, activation='relu'))m.add(Dense(728, activation='relu'))m.add(Dense(528, activation='relu'))m.add(Dense(500, activation='relu', name="bottleneck"))m.add(Dense(528, activation='relu'))m.add(Dense(728, activation='relu'))m.add(Dense(943, activation='linear'))m.compile(loss='mean_squared_error', optimizer='SGD')m.summary()
Model: "sequential"_________________________________________________________________Layer (type) Output Shape Param # =================================================================flatten (Flatten) (None, 943) 0 _________________________________________________________________dense (Dense) (None, 912) 860928 _________________________________________________________________dense_1 (Dense) (None, 728) 664664 _________________________________________________________________dense_2 (Dense) (None, 528) 384912 _________________________________________________________________bottleneck (Dense) (None, 500) 264500 _________________________________________________________________dense_3 (Dense) (None, 528) 264528 _________________________________________________________________dense_4 (Dense) (None, 728) 385112 _________________________________________________________________dense_5 (Dense) (None, 943) 687447 =================================================================Total params: 3,512,091Trainable params: 3,512,091Non-trainable params: 0
请注意,我们的瓶颈层输入的形状是(None,528)
。所以现在,在第二个模型中我们可以这样做:
model = Sequential()model.add(Dense(930, activation='relu', input_shape=(943, 1)))model.add(Flatten())model.add(Dense(528, activation='relu'))model.add(m.get_layer('bottleneck'))model.add(Flatten())model.add(Dense(100, activation='linear'))model.summary()
Model: "sequential_2"_________________________________________________________________Layer (type) Output Shape Param # =================================================================dense_9 (Dense) (None, 943, 930) 1860 _________________________________________________________________flatten_3 (Flatten) (None, 876990) 0 _________________________________________________________________dense_10 (Dense) (None, 528) 463051248 _________________________________________________________________bottleneck (Dense) (None, 500) 264500 _________________________________________________________________flatten_4 (Flatten) (None, 500) 0 _________________________________________________________________dense_11 (Dense) (None, 100) 50100 =================================================================Total params: 463,367,708Trainable params: 463,367,708Non-trainable params: 0