当前位置: 首页 > 面试题库 >

加载权重后如何在keras中添加和删除新图层?

盖泽宇
2023-03-14
问题内容

我正在尝试转学;为此,我想删除神经网络的最后两层并添加另外两层。这是一个示例代码,它也会输出相同的错误。

from keras.models import Sequential
from keras.layers import Input,Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.layers.core import Dropout, Activation
from keras.layers.pooling import GlobalAveragePooling2D
from keras.models import Model

in_img = Input(shape=(3, 32, 32))
x = Convolution2D(12, 3, 3, subsample=(2, 2), border_mode='valid', name='conv1')(in_img)
x = Activation('relu', name='relu_conv1')(x)
x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), name='pool1')(x)
x = Convolution2D(3, 1, 1, border_mode='valid', name='conv2')(x)
x = Activation('relu', name='relu_conv2')(x)
x = GlobalAveragePooling2D()(x)
o = Activation('softmax', name='loss')(x)
model = Model(input=in_img, output=[o])
model.compile(loss="categorical_crossentropy", optimizer="adam")
#model.load_weights('model_weights.h5', by_name=True)
model.summary()

model.layers.pop()
model.layers.pop()
model.summary()
model.add(MaxPooling2D())
model.add(Activation('sigmoid', name='loss'))

我使用删除了该图层,pop()但是当我尝试添加其输出时出现此错误

AttributeError:“模型”对象没有属性“添加”

我知道该错误的最可能原因是不当使用model.add()。我应该使用其他什么语法?

编辑:

我试图在keras中删除/添加图层,但不允许在加载外部重物后添加它。

from keras.models import Sequential
from keras.layers import Input,Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.layers.core import Dropout, Activation
from keras.layers.pooling import GlobalAveragePooling2D
from keras.models import Model
in_img = Input(shape=(3, 32, 32))

def gen_model():
    in_img = Input(shape=(3, 32, 32))
    x = Convolution2D(12, 3, 3, subsample=(2, 2), border_mode='valid', name='conv1')(in_img)
    x = Activation('relu', name='relu_conv1')(x)
    x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), name='pool1')(x)
    x = Convolution2D(3, 1, 1, border_mode='valid', name='conv2')(x)
    x = Activation('relu', name='relu_conv2')(x)
    x = GlobalAveragePooling2D()(x)
    o = Activation('softmax', name='loss')(x)
    model = Model(input=in_img, output=[o])
    return model

#parent model
model=gen_model()
model.compile(loss="categorical_crossentropy", optimizer="adam")
model.summary()

#saving model weights
model.save('model_weights.h5')

#loading weights to second model
model2=gen_model()
model2.compile(loss="categorical_crossentropy", optimizer="adam")
model2.load_weights('model_weights.h5', by_name=True)

model2.layers.pop()
model2.layers.pop()
model2.summary()

#editing layers in the second model and saving as third model
x = MaxPooling2D()(model2.layers[-1].output)
o = Activation('sigmoid', name='loss')(x)
model3 = Model(input=in_img, output=[o])

它显示此错误

RuntimeError: Graph disconnected: cannot obtain value for tensor input_4 at layer "input_4". The following previous layers were accessed without issue: []

问题答案:

您可以采用output最后一个模型,然后创建一个新模型。下层保持不变。

model.summary()
model.layers.pop()
model.layers.pop()
model.summary()

x = MaxPooling2D()(model.layers[-1].output)
o = Activation('sigmoid', name='loss')(x)

model2 = Model(input=in_img, output=[o])
model2.summary()

检查如何使用keras.applications中的模型进行转移学习?

编辑更新:

新的错误是因为您试图在全局模型上创建新模型,in_img而在先前的模型创建过程中并没有使用该模型。您实际上是在定义local
in_img。因此,全局in_img显然未连接到符号图中的上层。它与负载重量无关。

为了更好地解决此问题,您应该改用model.input引用输入。

model3 = Model(input=model2.input, output=[o])



 类似资料:
  • 我尝试在从KieBase中删除规则后重新创建KieSession,但删除的规则仍在触发。 我使用以下代码创建了一个KieBase并删除了一条规则: 但是当我根据ksesion1评估一个事实时,rule1仍然在触发。如何将编辑后的KieBase重新加载到新会话中?

  • 问题内容: 我正在尝试从我训练的模型中保存和加载权重。 我用来保存模型的代码是。 让我知道这是不正确的方法,还是有更好的方法。 但是当我尝试使用它们加载它们时, 但我得到这个错误: 关于我可能在做错的任何建议吗?先感谢您。 问题答案: Keras提供了三种不同的保存方法。这些在上面(带有示例)以及下面的视频链接中进行了描述。 首先,收到错误的原因是因为您打错电话。 要保存和加载模型的权重,您首先需

  • 问题内容: 我正在尝试将tinyMCE编辑器添加到我的页面,将其删除,然后再次添加,但出现错误。 当我运行A部分,然后运行B部分,而不是运行A部分时,出现错误: 甲部 B部分 编辑: 上面是创建JavaScript的后端分支,下面是完整的JavaScript函数。第一次通过它打开对话框并工作,其内容在编辑器中,没有错误。当我单击关闭按钮时,对话框关闭。当我再次运行该函数时,将显示对话框,但编辑器为

  • 问题内容: 我刚刚开始使用Sequelize和Sequelize CLI 由于这是开发时间,因此经常添加和删除列。在现有模型中添加新列的最佳方法是什么? 例如,我想将新列“ completed ”转换为 Todo 模型。我将此列添加到models / todo.js。下一步是什么? 我试过了 无法正常工作: “ 未 执行任何迁移,数据库架构已经是最新的。” 问题答案: 如果使用sequelize-

  • 问题内容: 由于IE9和Safari-5不支持,因此有什么替代的跨浏览器解决方案? 解决方案 必须 至少在 IE 9 , Safari 5 ,FireFox 4,Opera 11.5和Chrome中运行。 问题答案: 处理没有框架/库的类的一种方法是使用Element.className属性,该属性“ _获取并设置指定元素的class属性的值。 正如在他的回答中已经提到的那样,一旦获得了元素的类字

  • GridView包含ShowDeleteButton命令字段以及其他文本框字段。 我在C#中向这个网格添加新行,即为每个新添加的行添加新的文本框。如何在添加新行时添加删除链接?