【问题标题】:Graph disconnected: cannot obtain value for tensor KerasTensor() Transfer learning图断开连接:无法获取张量 KerasTensor() 迁移学习的值
【发布时间】:2021-03-24 23:04:50
【问题描述】:

我正在尝试在我自己的模型上实施迁移学习,但失败了。我的实现遵循此处的指南

https://keras.io/guides/transfer_learning/

How to do transfer-learning on our own models?

https://github.com/anujshah1003/Transfer-Learning-in-keras---custom-data/blob/master/transfer_learning_resnet50_custom_data.py

tensoflow 2.4.1
Keras 2.4.3

旧模型(效果很好):

model = Sequential()
inputShape = (256, 256, 3)
chanDim = -1
  
# CONV => RELU => POOL
model.add(Conv2D(32, (3, 3), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Dropout(0.25))

# (CONV => RELU) * 2 => POOL
model.add(Conv2D(64, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))

model.add(Conv2D(64, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# (CONV => RELU) * 2 => POOL
model.add(Conv2D(128, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(128, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# first (and only) set of FC => RELU layers
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))

# softmax classifier
model.add(Dense(classes))
model.add(Activation("softmax"))

迁移学习:

old_model = load_model('old.model')

# removes top 2 activation layers
for i in range(2):
  old_model.pop()

# mark loaded layers as not trainable
for layer in old_model.layers:
    layer.trainable = False

# initialize the new model

in_puts = Input(shape=(256, 256, 3))
count = len(old_model.layers)
ll = old_model.layers[count - 1].output
classes = len(lb.classes_)
ll = Dense(classes)(ll)
ll = Activation("softmax", name="activation3_" + NODE)(ll)
model = Model(inputs=in_puts, outputs=ll) # ERROR

opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])

# train the network
H = model.fit(x_train, y_train, validation_data=(x_test, y_test), steps_per_epoch=len(x_train) // BS, epochs=EPOCHS, verbose=1)


# save the model to disk
model.save("new.model")

错误

ValueError: Graph disconnected: cannot obtain value for tensor
KerasTensor(type_spec=TensorSpec(shape=(None, 256, 256, 3), dtype=tf.float32,
name='conv2d_input'), name='conv2d_input', description="created by layer 'conv2d_input'") at
layer "conv2d". The following previous layers were accessed without issue: []

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    这是使用模型操作迁移学习的简单方法

    classes = 10
    sub_old_model = Model(old_model.input, old_model.layers[-3].output)
    sub_old_model.trainable = False
    
    ll = Dense(classes)(sub_old_model.output)
    ll = Activation("softmax")(ll)
    
    model = Model(inputs=sub_old_model.input, outputs=ll) 
    

    首先,创建一个子模型,其中包含要冻结的旧模型的层 (trainable = False)。在我们的示例中,我们采用除最后一个DenseSoftmax 激活之外的所有层。

    然后将子模型输出传递到新的可训练层。

    此时,您只需要创建一个新模型实例来组装所有部件

    【讨论】:

      【解决方案2】:

      在@Marco Cerliani 的帮助下,我能够通过更改为LabelEncodersparse_categorical_crossentropy 来解决问题

      【讨论】:

      • 嗨,我创建了一个自定义模型。现在我又多了一个数据集。所以我的目标是进行迁移学习并更新模型。在关注了许多链接和视频之后,我仍然没有得到欲望模型。 loss: nan - accuracy: 0.0000e+00 这就是我得到的。你能帮我完成步骤吗?
      猜你喜欢
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2018-08-11
      • 2019-06-06
      • 2019-01-02
      • 2021-01-27
      • 1970-01-01
      相关资源
      最近更新 更多