tensorflow - 如何使用 Keras 卡住特定层的权重?

标签 tensorflow machine-learning keras mnist

我试图使用 Keras 和 mnist 数据集卡住预测模型中某些层的权重,但它不起作用。代码如下:

from keras.layers import Dense, Flatten
from keras.utils import to_categorical
from keras.models import Sequential, load_model
from keras.datasets import mnist
from keras.losses import categorical_crossentropy

import numpy as np

def load_data():
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    y_train = to_categorical(y_train, num_classes=10)
    y_test = to_categorical(y_test, num_classes=10)
    return x_train, y_train, x_test, y_test


def run():
    x_train, y_train, x_test, y_test = load_data()
    model = Sequential([Flatten(input_shape=(28, 28)),
                        Dense(300, name='dense1', activation='relu'),
                        Dense(100, name='dense2', activation='relu'),
                        Dense(10, name='dense3', activation='softmax')])
    model.trainable = True
    model.compile(optimizer='Adam',
                  metrics=['accuracy'],
                  loss=categorical_crossentropy)

    print(model.summary())
    model.fit(x_train, y_train, epochs=5, verbose=2)
    print(model.evaluate(x_test, y_test))
    return model

def freeze(model):
    x_train, y_train, x_test, y_test = load_data()

    name = 'dense1'

    weightsAndBias = model.get_layer(name=name).get_weights()

    # freeze the weights of this layer
    model.get_layer(name=name).trainable = False

    # record the weights before retrain
    weights_before = weightsAndBias[0]
    # retrain
    model.fit(x_train, y_train, verbose=2, epochs=1)
    weights_after = model.get_layer(name=name).get_weights()[0]

    if (weights_before == weights_after).all():
        print('the weights did not change!!!')
    else:
        print('the weights changed!!!!')

if __name__ == '__main__':
    model = run()
    freeze(model)

程序输出“权重已更改!!!”。 我不明白为什么名为“dense1”的层的权重在设置 model.get_layer(name=name).trainable = False 后发生变化。

最佳答案

您可以使用以下方法来做到这一点:

model=Sequential()
layer=Dense(64,init='glorot_uniform',input_shape=(784,))
layer.trainable=False
model.add(layer)
layer2=Dense(784, activation='sigmoid',init='glorot_uniform')
layer2.trainable=True
model.add(layer2)
model.compile(loss='relu', optimizer=sgd,metrics = ['mae'])

关于tensorflow - 如何使用 Keras 卡住特定层的权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55059529/

相关文章:

python - Keras 层构建错误 : build() takes 1 Positional Argument but two were given

tensorflow - tf.contrib.rnn.static_rnn - 'Tensor' 对象不可迭代

python - 导入和使用 keras/tensorflow 时出现 ModuleNotFoundError

python - model.fit() 是否在每个时期后重置指标?如何手动重置指标?

python - pip3 : command not found

python - 在 Tensorflow 2.1 中转换后无法加载 Tensor RT SavedModel

machine-learning - 用什么来训练自注意力机制?

python - 在 scikit-learn 中将 RandomizedSearchCV(或 GridSearcCV)与 LeaveOneGroupOut 交叉验证相结合

python - 与 R 相比,Python 中支持向量机的技术较差

python - 'conv2d_2/convolution' 1减3导致的负维度大小