Tensorflow Keras去除了最后一层的激活功能

Tensorflow Keras去除了最后一层的激活功能,tensorflow,keras,Tensorflow,Keras,我想将ResNet50与图像净重一起使用 ResNet50的最后一层是(从) 我需要保留此层的权重,但删除softmax函数 我想手动更改它,使我的最后一层看起来像这样 x = layers.Dense(1000, name='fc1000')(x) resnet = Sequential([ Input(shape(224,224,3)), ResNet50(weights='imagenet', input_shape(224,224,3)) ]) 但重量保持不变

我想将ResNet50与图像净重一起使用

ResNet50的最后一层是(从)

我需要保留此层的权重,但删除softmax函数

我想手动更改它,使我的最后一层看起来像这样

x = layers.Dense(1000, name='fc1000')(x)
resnet = Sequential([
    Input(shape(224,224,3)),
    ResNet50(weights='imagenet', input_shape(224,224,3))
    ])
但重量保持不变。

现在我这样叫我的网

x = layers.Dense(1000, name='fc1000')(x)
resnet = Sequential([
    Input(shape(224,224,3)),
    ResNet50(weights='imagenet', input_shape(224,224,3))
    ])

我需要输入层,因为否则model.compile会说占位符没有填充。

通常有两种方法可以实现这一点:

快捷方式-支持的功能: 要更改最后一层的激活函数,可以传递一个参数
classifier\u activation

因此,为了消除所有激活,您的模块可以被称为:

将tensorflow导入为tf
resnet=tf.keras.Sequential([
tf.keras.layers.Input(shape=(224224,3)),
tf.keras.applications.ResNet50(
权重='imagenet',
输入_形=(224224,3),
pooling=“avg”,
分类器\激活=无
)
])
但是,如果您想要一个不同的功能,而Keras
Classifier\u激活
参数(例如自定义激活功能)不支持此功能,则此功能将不起作用

要实现这一点,您可以使用变通解决方案:

长途跋涉-复制模型的权重 此解决方案建议将原始模型的权重复制到自定义模型上。这种方法之所以有效,是因为除了激活功能外,您没有改变模型的体系结构

您需要:
1.下载原始型号。
2.保存它的重量。
3.声明模型的修改版本(在您的情况下,没有激活功能)。
4.设置新模型的权重

下面的代码片段更详细地解释了这个概念:

将tensorflow导入为tf
# 1. 下载原始resnet
resnet=tf.keras.Sequential([
tf.keras.layers.Input(shape=(224224,3)),
tf.keras.applications.ResNet50(
权重='imagenet',
输入_形=(224224,3),
pooling=“avg”
)
])
# 2. 在内存中保存权重:
imagenet_weights=resnet.get_weights()
# 3. 声明模型,但不使用softmax
resnet\u no\u softmax=tf.keras.Sequential([
tf.keras.layers.Input(shape=(224224,3)),
tf.keras.applications.ResNet50(
include_top=False,
权重='imagenet',
输入_形=(224224,3),
pooling=“avg”
),
tf.keras.layers.Dense(1000,name='fc1000')
])
# 4. 将imagenet权重传递到第二个resnet
resnet\u no\u softmax.设置权重(图像净权重)
希望这有帮助