Bài đăng này dường như chỉ ra rằng những gì tôi muốn thực hiện là không thể. Tuy nhiên, tôi không bị thuyết phục về điều này - với những gì tôi đã làm, tôi không hiểu tại sao những gì tôi muốn làm không thể đạt được ...
Tôi có hai bộ dữ liệu hình ảnh trong đó một bộ có hình ảnh có hình dạng (480, 720, 3) trong khi bộ kia có hình ảnh có hình dạng (540, 960, 3).
Tôi đã khởi tạo một mô hình bằng mã sau đây:
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'])
Bây giờ tôi đã đào tạo mô hình này trên tập dữ liệu cũ, tôi muốn tắt lớp tenxơ đầu vào và thêm vào mô hình với một tenxơ đầu vào mới có hình dạng khớp với kích thước hình ảnh của tập dữ liệu sau.
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')
dẫn đến lỗi này:
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'
Trong bài đăng mà tôi đã liên kết, maz nói rằng có một sự không phù hợp về kích thước ngăn thay đổi lớp đầu vào của một mô hình - nếu đây là trường hợp, thì làm thế nào mà tôi đặt một lớp đầu vào (480, 720, 3) ở phía trước của mô hình VGG16 dự kiến hình ảnh (224, 224, 3)?
Tôi nghĩ một vấn đề có khả năng hơn là đầu ra của mô hình cũ của tôi đang mong đợi một cái gì đó khác với những gì tôi đang đưa ra dựa trên những gì fchollet đang nói trong bài viết này . Tôi bị nhầm lẫn về mặt cú pháp, nhưng tôi tin rằng toàn bộ x = Layer()(x)
phân khúc đang xây dựng từng lớp từng mảnh từ đầu vào-> đầu ra và chỉ cần ném một đầu vào khác ở phía trước là phá vỡ nó.
Tôi thực sự không biết mặc dù ...
Ai đó có thể vui lòng cho tôi biết làm thế nào để hoàn thành những gì tôi đang cố gắng làm hoặc nếu không thể, giải thích cho tôi tại sao không?