【问题标题】:How to get the correct wights?如何获得正确的权重?
【发布时间】:2021-06-07 08:22:17
【问题描述】:
  • 我正在处理 NLP 数据集。
  • 我有一个数据集,我想在分类问题上进行训练(包含 5 个类别),在此阶段之后,我想在测试数据上使用经过训练的模型来构建嵌入向量,该向量将用于聚类算法。

我建立了以下模型:

model = Sequential()
model.add(layers.Embedding(input_dim=14000, output_dim=100, input_length=100))
model.add(layers.Conv1D(filters=32, kernel_size=8, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Flatten())
model.add(layers.Dense(10, activation='relu'))
model.add(layers.Dense(5, activation='softmax'))
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])



Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding (Embedding)        (None, 100, 100)          1470700   
_________________________________________________________________
conv1d (Conv1D)              (None, 93, 32)            25632     
_________________________________________________________________
global_max_pooling1d (Global (None, 32)                0         
_________________________________________________________________
flatten (Flatten)            (None, 32)                0         
_________________________________________________________________
dense (Dense)                (None, 10)                330       
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 55        
=================================================================
Total params: 1,496,717
Trainable params: 1,496,717
Non-trainable params: 0
_________________________________________________________________
  • 在用训练数据拟合模型后,我想预测测试数据并获得扁平层之后的值(wights)(我想使用这个 wights 作为聚类算法的输入)。

    for i, val in enumerate(X_test_text):
          y_predict = model.predict(X_test_text[i:i+1])            
          embedding = XXX_get_wights_XXX(i: ??
    
  • 我在 predict 之后检查了 wights 值,结果向量长度与我想的不同:

  1. 为什么model.get_layer("flatten").get_weights() 给我一个长度为 0 的列表? (我确信这一层将用作嵌入层,并且会给我一个包含 32 个值的向量)
  2. 为什么model.get_layer("dense").get_weights()[0].shape 给出元组 (32, 10) ?为什么元组包含两个值而不是一个? (只有 32 个?)
  3. 为每个预测值获取包含 32 个 wight 的向量(在展平层之后)的正确方法是什么?

【问题讨论】:

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


    【解决方案1】:

    您正在寻找模型输出而不是模型权重。要从Flatten 层获取模型输出,您只需初始化一个新模型以提取并生成您想要的输出...

    model = Sequential()
    model.add(layers.Embedding(input_dim=14000, output_dim=100, input_length=100))
    model.add(layers.Conv1D(filters=32, kernel_size=8, activation='relu'))
    model.add(layers.GlobalMaxPooling1D())
    model.add(layers.Flatten())
    model.add(layers.Dense(10, activation='relu'))
    model.add(layers.Dense(5, activation='softmax'))
    model.compile(optimizer='adam',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    
    # model.fit(X_train,y_train, ...)
    

    Flatten 层获取模型输出:

    n_sample = 20
    X_test = np.random.randint(0,14000, (n_sample, 100))
    
    from tensorflow.keras.models import Model
    
    intermediate_model = Model(model.inputs, model.get_layer("flatten").output)
    intermediate_model.predict(X_test).shape # (n_sample, 32)
    

    PS:在GlobalMaxPooling 之后使用Flatten 是没有用的,因为GlobalMaxPooling 输出是二维的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2014-03-05
      • 1970-01-01
      • 2011-03-16
      • 2014-02-11
      • 2021-11-29
      • 2023-04-06
      相关资源
      最近更新 更多