在keras中获取中间层的权重

数据挖掘 机器学习 深度学习 喀拉斯 美国有线电视新闻网 图像识别
2021-10-12 20:25:59

我有一个图像数据集 376 个类,每个类有 15 张图片对应一个人。我想得到与每个人对应的特征向量。

我所做的是,在我编译模型之后,我使用这个链接 作为参考来获取最后一个卷积层的权重。但是,当我这样做时,我得到了错误:

InvalidArgumentError: You must feed a value for placeholder tensor 'conv_layer' with dtype float and shape [?,19,19,360]

我该如何解决这个问题?

这是我到目前为止所做的代码:

train_data = np.array(train_data, dtype=np.float32)
test_data = np.array(test_data, dtype=np.float32)
train_data = train_data / 180 # to make the array values between 0-1 
test_data = test_data / 180
train_label = keras.utils.to_categorical(train_label, 376)
test_label = keras.utils.to_categorical(test_label, 376)
# CNN MODEL
model = Sequential()
model.add(Conv2D(180, (3, 3), padding='same', input_shape=(180, 180, 3), 
activation="relu")) #180 is the number of filters
model.add(Conv2D(180, (3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(3, 3))) 
model.add(Dropout(0.25))
model.add(Conv2D(360, (3, 3), padding='same', activation="relu"))
model.add(Conv2D(360, (3, 3), activation="relu"))
conv_layer = model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Dropout(0.25))
flatten_layer = model.add(Flatten())
model.add(Dense(496, activation="relu"))
model.add(Dropout(0.5))
dense_layer = model.add(Dense(376, activation="softmax"))
#compiling the model
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
model.fit(
train_data,
train_label,
batch_size=32,
epochs=40,
verbose = 2 ,
validation_split=0.1,
shuffle=True)
# getting intermediate  layer weights 
get_layer_output = K.function([model.layers[0].input],
                              [model.layers[11].output])
layer_output = get_layer_output([conv_layer])[0]
1个回答

从网络创建截断输出的最简单方法是创建它的子网络并应用训练网络的权重。以下示例是对您在此处显示的内容的修改,但它将引导您

你最初想训练的网络

模型=顺序()
model.add(Conv2D(10, (3, 3), padding='same', input_shape=(60, 60, 3),
                 激活=“relu”))
model.add(Conv2D(10, (3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(辍学(0.25))
model.add(展平())
model.add(密集(5,激活=“softmax”))
模型.编译(
    损失='categorical_crossentropy',
    优化器='亚当',
    指标=['准确性'])

模型.fit(
    训练数据,
    火车标签)

现在创建一个您想要输出的子网络,如上面的示例

model_new = 顺序()
model_new.add(Conv2D(10, (3, 3), padding='same', input_shape=(60, 60, 3),
                     激活=“relu”))
model_new.add(Conv2D(10, (3, 3), activation="relu"))
model_new.add(MaxPooling2D(pool_size=(3, 3)))
model_new.add(辍学(0.25))
model_new.add(展平())

model_new.compile(
    损失='categorical_crossentropy',
    优化器='亚当',
    指标=['mse'])

# 您需要对创建的随机数组应用拟合,以便初始化 
# 权重。无论如何,您将用上面的原始替换它们。
model_new.fit(train_data, y=np.random.rand(40, 3610))

现在从第一个训练的网络中获取权重并替换第二个网络的权重,例如

model_new.set_weights(weights=model.get_weights())

您可以通过实际添加这些检查语句来检查上述步骤中的权重是否更改,例如

print("数组拟合前是否相等-",
      any([np.array_equal(a1, a2) 用于 a1, a2 in zip(model_new.get_weights(), model.get_weights()[:4])]))

model_new.set_weights(weights=model.get_weights())
print("加权后的数组是否相等 -",
      all([np.array_equal(a1, a2) for a1, a2 in zip(model_new.get_weights(), model.get_weights()[:4])]))

这应该产生

数组在拟合之前是否相等 - False
应用权重后数组是否相等 - 真

希望这可以帮助。