โพสต์นี้ดูเหมือนจะบ่งบอกว่าสิ่งที่ฉันต้องการทำสำเร็จนั้นเป็นไปไม่ได้ อย่างไรก็ตามฉันไม่มั่นใจในสิ่งนี้ - เนื่องจากสิ่งที่ฉันทำไปแล้วฉันไม่เห็นว่าทำไมสิ่งที่ฉันต้องการทำไม่สามารถทำได้ ...
ฉันมีชุดข้อมูลภาพสองชุดโดยที่หนึ่งมีรูปภาพของรูปร่าง (480, 720, 3) ในขณะที่อีกชุดมีรูปภาพของรูปร่าง (540, 960, 3)
ฉันเริ่มต้นโมเดลโดยใช้รหัสต่อไปนี้:
input = Input(shape=(480, 720, 3), name='image_input')
initial_model = VGG16(weights='imagenet', include_top=False)
for layer in initial_model.layers:
layer.trainable = False
x = Flatten()(initial_model(input))
x = Dense(1000, activation='relu')(x)
x = BatchNormalization()(x)
x = Dropout(0.5)(x)
x = Dense(1000, activation='relu')(x)
x = BatchNormalization()(x)
x = Dropout(0.5)(x)
x = Dense(14, activation='linear')(x)
model = Model(inputs=input, outputs=x)
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
ตอนนี้ฉันได้ฝึกฝนโมเดลนี้กับชุดข้อมูลเดิมฉันต้องการป๊อปเลเยอร์เทนเซอร์ปิดและเตรียมโมเดลด้วยเทนเซอร์อินพุทใหม่ที่มีรูปร่างที่ตรงกับขนาดภาพของชุดข้อมูลหลัง
model = load_model('path/to/my/trained/model.h5')
old_input = model.pop(0)
new_input = Input(shape=(540, 960, 3), name='image_input')
x = model(new_input)
m = Model(inputs=new_input, outputs=x)
m.save('transfer_model.h5')
ซึ่งทำให้เกิดข้อผิดพลาดนี้:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2506, in save
save_model(self, filepath, overwrite, include_optimizer)
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/models.py", line 106, in save_model
'config': model.get_config()
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2322, in get_config
layer_config = layer.get_config()
File "/home/aicg2/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2370, in get_config
new_node_index = node_conversion_map[node_key]
KeyError: u'image_input_ib-0'
ในโพสต์ที่ฉันเชื่อมโยง maz ระบุว่ามีมิติที่ไม่ตรงกันซึ่งป้องกันการเปลี่ยนเลเยอร์ของโมเดล - ถ้าเป็นกรณีนี้แล้วฉันจะใส่เลเยอร์อินพุต (480, 720, 3) ไว้ข้างหน้าได้อย่างไร ของรุ่น VGG16 ซึ่งคาดว่าจะมีภาพ (224, 224, 3)?
ผมคิดว่าเป็นปัญหาที่มีแนวโน้มมากขึ้นว่าการส่งออกรูปแบบในอดีตของฉันเป็นที่คาดหวังว่าบางสิ่งบางอย่างที่แตกต่างจากสิ่งที่ฉันให้มันขึ้นอยู่กับสิ่ง fchollet ไม่ว่าจะเป็นในโพสต์นี้ ฉันสับสนทางวากยสัมพันธ์ แต่ฉันเชื่อว่าเซกเมนต์ทั้งหมดx = Layer()(x)
กำลังสร้างเลเยอร์ทีละชิ้นจากอินพุต -> เอาท์พุทและเพียงแค่โยนอินพุตที่แตกต่างออกไปข้างหน้าก็ทำให้มันพัง
ฉันไม่รู้จริงๆว่า ...
ใครบางคนได้โปรดให้ความกระจ่างแก่ฉันเกี่ยวกับวิธีการทำสิ่งที่ฉันพยายามทำหรือถ้าเป็นไปไม่ได้อธิบายให้ฉันฟังหน่อย