- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何最好地将预处理层(例如,减去均值并除以标准差)添加到 keras (v2.0.5) 模型,以便模型完全独立部署(可能在 C++ 环境中)。我试过:
def getmodel():
model = Sequential()
mean_tensor = K.placeholder(shape=(1,1,3), name="mean_tensor")
std_tensor = K.placeholder(shape=(1,1,3), name="std_tensor")
preproc_layer = Lambda(lambda x: (x - mean_tensor) / (std_tensor + K.epsilon()),
input_shape=im_shape)
model.add(preproc_layer)
# Build the remaining model, perhaps set weights,
...
return model
然后,在其他地方设置模型的均值/标准。我找到了 set_value功能所以尝试了以下:
m = getmodel()
mean, std = get_mean_std(..)
graph = K.get_session().graph
mean_tensor = graph.get_tensor_by_name("mean_tensor:0")
std_tensor = graph.get_tensor_by_name("std_tensor:0")
K.set_value(mean_tensor, mean)
K.set_value(std_tensor, std)
但是 set_value
失败了
AttributeError: 'Tensor' object has no attribute 'assign'
所以 set_value
并不像(有限的)文档建议的那样工作。这样做的正确方法是什么?获取 TF session ,将所有训练代码包装在 with (session)
中并使用 feed_dict?我原以为会有一种原生的 keras 方法来设置张量值。
我没有使用占位符,而是尝试使用 K.variable
或 K.constant
设置模型构建的均值/标准差:
mean_tensor = K.variable(mean, name="mean_tensor")
std_tensor = K.variable(std, name="std_tensor")
这避免了任何 set_value
问题。虽然我注意到如果我尝试训练该模型(我知道这不是特别有效,因为您正在为每个图像重新进行标准化)它可以工作但是在第一个纪元结束时 ModelCheckpoint处理程序失败并显示非常深的堆栈跟踪:
...
File "/Users/dgorissen/Library/Python/2.7/lib/python/site-packages/keras/models.py", line 102, in save_model
'config': model.get_config()
File "/Users/dgorissen/Library/Python/2.7/lib/python/site-packages/keras/models.py", line 1193, in get_config
return copy.deepcopy(config)
File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 163, in deepcopy
y = copier(x, memo)
...
File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 190, in deepcopy
y = _reconstruct(x, rv, 1, memo)
File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 343, in _reconstruct
y.__dict__.update(state)
AttributeError: 'NoneType' object has no attribute 'update'
更新 1:
我还尝试了一种不同的方法。像往常一样训练一个模型,然后添加第二个进行预处理的模型:
# Regular model, trained as usual
model = ...
# Preprocessing model
preproc_model = Sequential()
mean_tensor = K.constant(mean, name="mean_tensor")
std_tensor = K.constant(std, name="std_tensor")
preproc_layer = Lambda(lambda x: (x - mean_tensor) / (std_tensor + K.epsilon()),
input_shape=im_shape, name="normalisation")
preproc_model.add(preproc_layer)
# Prepend the preprocessing model to the regular model
full_model = Model(inputs=[preproc_model.input],
outputs=[model(preproc_model.output)])
# Save the complete model to disk
full_model.save('full_model.hdf5')
这似乎一直有效,直到 save()
调用失败,并显示与上面相同的深层堆栈跟踪。也许 Lambda
层是问题所在,但从 this issue 来看不过,它似乎应该正确序列化。
总的来说,如何在不影响序列化(和导出到 pb)能力的情况下将规范化层附加到 keras 模型?
我确定您可以通过直接下拉到 TF(例如 this thread 或使用 tf.Transform )来让它工作,但我认为它可以直接在 keras 中实现。
更新 2:
所以我发现可以通过以下方式避免深层堆栈跟踪
def foo(x):
bar = K.variable(baz, name="baz")
return x - bar
因此在函数内部定义 bar
而不是从外部范围捕获。
然后我发现我可以保存到磁盘但无法从磁盘加载。围绕这个有一套github问题。我使用了 #5396 中指定的解决方法将所有变量作为参数传递,这让我可以保存和加载。
我以为我快到了,我继续使用上面更新 1 中的方法,将预处理模型堆叠在经过训练的模型前面。然后导致 Model is not compiled
错误。解决了这些问题,但最终我从未设法使以下方法起作用:
我已经达到了没有错误的地步,但无法让归一化张量传播到卡住的 pb。在这上面花了太多时间,然后我放弃并转向不太优雅的方法:
现在所有这些都按预期完全正常工作。训练开销很小,但对我来说可以忽略不计。
仍然无法弄清楚如何在 keras 中设置张量变量的值(不引发 assign
异常)但现在可以不用它。
将接受@Daniel 的回答,因为它让我朝着正确的方向前进。
相关问题:
最佳答案
创建变量时,必须给它“值”,而不是形状:
mean_tensor = K.variable(mean, name="mean_tensor")
std_tensor = K.variable(std, name="std_tensor")
现在,在 Keras 中,您不必处理 session 、图形和类似的东西。您只使用层,在 Lambda 层(或损失函数)内您可以使用张量。
对于我们的 Lambda 层,我们需要一个更复杂的函数,因为在进行计算之前形状必须匹配。因为我不知道 im_shape
,所以我认为它有 3 个维度:
def myFunc(x):
#reshape x in a way it's compatible with the tensors mean and std:
x = K.reshape(x,(-1,1,1,3))
#-1 is like a wildcard, it will be the value that matches the rest of the given shape.
#I chose (1,1,3) because it's the same shape of mean_tensor and std_tensor
result = (x - mean_tensor) / (std_tensor + K.epsilon())
#now shape it back to the same shape it was before (which I don't know)
return K.reshape(result,(-1,im_shape[0], im_shape[1], im_shape[2]))
#-1 is still necessary, it's the batch size
现在我们创建 Lambda 层,考虑到它还需要一个输出形状(因为您的自定义操作,系统不一定知道输出形状)
model.add(Lambda(myFunc,input_shape=im_shape, output_shape=im_shape))
在此之后,只需编译模型并对其进行训练。 (通常使用 model.compile(...)
和 model.fit(...)
)
如果你想包含所有内容,包括函数内部的预处理,也可以:
def myFunc(x):
mean_tensor = K.mean(x,axis=[0,1,2]) #considering shapes of (size,width, heigth,channels)
std_tensor = K.std(x,axis=[0,1,2])
x = K.reshape(x, (-1,3)) #shapes of mean and std are (3,) here.
result = (x - mean_tensor) / (std_tensor + K.epsilon())
return K.reshape(result,(-1,width,height,3))
现在,所有这些都是您模型中的额外计算,并且会消耗处理。最好只在模型之外做所有事情。首先创建预处理数据并存储它,然后创建没有这个预处理层的模型。这样你就可以获得更快的模型。 (如果您的数据或模型太大,这可能很重要)。
关于python - 为keras模型添加预处理层并设置张量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44835223/
可不可以命名为MVVM模型?因为View通过查看模型数据。 View 是否应该只与 ViewModelData 交互?我确实在某处读到正确的 MVVM 模型应该在 ViewModel 而不是 Mode
我正在阅读有关设计模式的文章,虽然作者们都认为观察者模式很酷,但在设计方面,每个人都在谈论 MVC。 我有点困惑,MVC 图不是循环的,代码流具有闭合拓扑不是很自然吗?为什么没有人谈论这种模式: mo
我正在开发一个 Sticky Notes 项目并在 WPF 中做 UI,显然将 MVVM 作为我的架构设计选择。我正在重新考虑我的模型、 View 和 View 模型应该是什么。 我有一个名为 Not
不要混淆:How can I convert List to Hashtable in C#? 我有一个模型列表,我想将它们组织成一个哈希表,以枚举作为键,模型列表(具有枚举的值)作为值。 publi
我只是花了一些时间阅读这些术语(我不经常使用它们,因为我们没有任何 MVC 应用程序,我通常只说“模型”),但我觉得根据上下文,这些意味着不同的东西: 实体 这很简单,它是数据库中的一行: 2) In
我想知道你们中是否有人知道一些很好的教程来解释大型应用程序的 MVVM。我发现关于 MVVM 的每个教程都只是基础知识解释(如何实现模型、 View 模型和 View ),但我对在应用程序页面之间传递
我想realm.delete() 我的 Realm 中除了一个模型之外的所有模型。有什么办法可以不列出所有这些吗? 也许是一种遍历 Realm 中当前存在的所有类型的方法? 最佳答案 您可以从您的 R
我正在尝试使用 alias 指令模拟一个 Eloquent 模型,如下所示: $transporter = \Mockery::mock('alias:' . Transporter::class)
我正在使用 stargazer 创建我的 plm 汇总表。 library(plm) library(pglm) data("Unions", package = "pglm") anb1 <- pl
我读了几篇与 ASP.NET 分层架构相关的文章和问题,但是读得太多后我有点困惑。 UI 层是在 ASP.NET MVC 中开发的,对于数据访问,我在项目中使用 EF。 我想通过一个例子来描述我的问题
我收到此消息错误: Inceptionv3.mlmodel: unable to read document 我下载了最新版本的 xcode。 9.4 版测试版 (9Q1004a) 最佳答案 您没有
(同样,一个 MVC 验证问题。我知道,我知道......) 我想使用 AutoMapper ( http://automapper.codeplex.com/ ) 来验证我的创建 View 中不在我
需要澄清一件事,现在我正在处理一个流程,其中我有两个 View 模型,一个依赖于另一个 View 模型,为了处理这件事,我尝试在我的基本 Activity 中注入(inject)两个 View 模型,
如果 WPF MVVM 应该没有代码,为什么在使用 ICommand 时,是否需要在 Window.xaml.cs 代码中实例化 DataContext 属性?我已经并排观看并关注了 YouTube
当我第一次听说 ASP.NET MVC 时,我认为这意味着应用程序由三个部分组成:模型、 View 和 Controller 。 然后我读到 NerdDinner并学习了存储库和 View 模型的方法
Platform : ubuntu 16.04 Python version: 3.5.2 mmdnn version : 0.2.5 Source framework with version :
我正在学习本教程:https://www.raywenderlich.com/160728/object-oriented-programming-swift ...并尝试对代码进行一些个人调整,看看
我正试图围绕 AngularJS。我很喜欢它,但一个核心概念似乎在逃避我——模型在哪里? 例如,如果我有一个显示多个交易列表的应用程序。一个列表向服务器查询匹配某些条件的分页事务集,另一个列表使用不同
我在为某个应用程序找出最佳方法时遇到了麻烦。我不太习惯取代旧 TLA(三层架构)的新架构,所以这就是我的来源。 在为我的应用程序(POCO 类,对吧??)设计模型和 DAL 时,我有以下疑问: 我的模
我有两个模型:Person 和 Department。每个人可以在一个部门工作。部门可以由多人管理。我不确定如何在 Django 模型中构建这种关系。 这是我不成功的尝试之一 [models.py]:
我是一名优秀的程序员,十分优秀!