我可以在反向传播期间(有选择地)反转 Theano 梯度吗?

2024-05-06

我热衷于利用最近论文中提出的架构“通过反向传播进行无监督域适应 http://arxiv.org/pdf/1409.7495.pdf“在 Lasagne/Theano 框架中。

这篇论文的有点不同寻常之处在于它包含了一个“梯度反转层”,inverts反向传播期间的梯度:

(图像底部的箭头是梯度反转的反向传播)。

在论文中,作者声称该方法“可以使用任何深度学习包来实现”,事实上他们提供了一种caffe 制作的版本 https://github.com/ddtm/caffe/tree/grl.

然而,由于各种原因,我正在使用 Lasagne/Theano 框架。

是否有可能在 Lasagne/Theano 中创建这样的梯度反转层?我还没有看到任何可以将自定义标量变换应用于这样的渐变的示例。如果是这样,我可以通过在烤宽面条中创建自定义图层来实现吗?


这是使用普通 Theano 的草图实现。这可以很容易地集成到烤宽面条中。

您需要创建一个自定义操作,该操作在前向传递中充当恒等操作,但在后向传递中反转梯度。

以下是有关如何实施的建议。它未经测试,我不能 100% 确定我已经正确理解了所有内容,但您也许可以根据需要进行验证和修复。

class ReverseGradient(theano.gof.Op):
    view_map = {0: [0]}

    __props__ = ('hp_lambda',)

    def __init__(self, hp_lambda):
        super(ReverseGradient, self).__init__()
        self.hp_lambda = hp_lambda

    def make_node(self, x):
        return theano.gof.graph.Apply(self, [x], [x.type.make_variable()])

    def perform(self, node, inputs, output_storage):
        xin, = inputs
        xout, = output_storage
        xout[0] = xin

    def grad(self, input, output_gradients):
        return [-self.hp_lambda * output_gradients[0]]

使用纸张符号和命名约定,这是他们提出的完整通用模型的简单 Theano 实现。

import numpy
import theano
import theano.tensor as tt


def g_f(z, theta_f):
    for w_f, b_f in theta_f:
        z = tt.tanh(theano.dot(z, w_f) + b_f)
    return z


def g_y(z, theta_y):
    for w_y, b_y in theta_y[:-1]:
        z = tt.tanh(theano.dot(z, w_y) + b_y)
    w_y, b_y = theta_y[-1]
    z = tt.nnet.softmax(theano.dot(z, w_y) + b_y)
    return z


def g_d(z, theta_d):
    for w_d, b_d in theta_d[:-1]:
        z = tt.tanh(theano.dot(z, w_d) + b_d)
    w_d, b_d = theta_d[-1]
    z = tt.nnet.sigmoid(theano.dot(z, w_d) + b_d)
    return z


def l_y(z, y):
    return tt.nnet.categorical_crossentropy(z, y).mean()


def l_d(z, d):
    return tt.nnet.binary_crossentropy(z, d).mean()


def mlp_parameters(input_size, layer_sizes):
    parameters = []
    previous_size = input_size
    for layer_size in layer_sizes:
        parameters.append((theano.shared(numpy.random.randn(previous_size, layer_size).astype(theano.config.floatX)),
                           theano.shared(numpy.zeros(layer_size, dtype=theano.config.floatX))))
        previous_size = layer_size
    return parameters, previous_size


def compile(input_size, f_layer_sizes, y_layer_sizes, d_layer_sizes, hp_lambda, hp_mu):
    r = ReverseGradient(hp_lambda)

    theta_f, f_size = mlp_parameters(input_size, f_layer_sizes)
    theta_y, _ = mlp_parameters(f_size, y_layer_sizes)
    theta_d, _ = mlp_parameters(f_size, d_layer_sizes)

    xs = tt.matrix('xs')
    xs.tag.test_value = numpy.random.randn(9, input_size).astype(theano.config.floatX)
    xt = tt.matrix('xt')
    xt.tag.test_value = numpy.random.randn(10, input_size).astype(theano.config.floatX)
    ys = tt.ivector('ys')
    ys.tag.test_value = numpy.random.randint(y_layer_sizes[-1], size=9).astype(numpy.int32)

    fs = g_f(xs, theta_f)
    e = l_y(g_y(fs, theta_y), ys) + l_d(g_d(r(fs), theta_d), 0) + l_d(g_d(r(g_f(xt, theta_f)), theta_d), 1)

    updates = [(p, p - hp_mu * theano.grad(e, p)) for theta in theta_f + theta_y + theta_d for p in theta]
    train = theano.function([xs, xt, ys], outputs=e, updates=updates)

    return train


def main():
    theano.config.compute_test_value = 'raise'
    numpy.random.seed(1)
    compile(input_size=2, f_layer_sizes=[3, 4], y_layer_sizes=[7, 8], d_layer_sizes=[5, 6], hp_lambda=.5, hp_mu=.01)


main()

这是未经测试的,但以下内容可能允许此自定义操作用作烤宽面条层:

class ReverseGradientLayer(lasagne.layers.Layer):
    def __init__(self, incoming, hp_lambda, **kwargs):
        super(ReverseGradientLayer, self).__init__(incoming, **kwargs)
        self.op = ReverseGradient(hp_lambda)

    def get_output_for(self, input, **kwargs):
        return self.op(input)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在反向传播期间(有选择地)反转 Theano 梯度吗? 的相关文章

  • 在caffe prototxt 文件中。 TRAIN 和 TEST 阶段做什么?

    我是咖啡新手 感谢你们 in https github com BVLC caffe blob master src caffe proto caffe proto https github com BVLC caffe blob mast
  • 如何在prototxt文件中写注释?

    我找不到如何写评论prototxt files 有没有办法在 prototxt 文件中添加注释 如何 Thanks 您可以通过添加评论 char 之后的行中的所有内容都是注释 layer name aLayerWithComments I
  • 将静态数据(不随时间变化)添加到 LSTM 中的序列数据

    我正在尝试建立一个如下图所示的模型 请看下图 我想在 LSTM 层中传递序列数据 在另一个前馈神经网络层中传递静态数据 血型 性别 后来我想将它们合并 然而 我对这里的维度感到困惑 如果我的理解是正确的 如图所示 5维序列数据如何与4维静态
  • 简单的神经网络无法学习异或

    我正在尝试学习神经网络 并编写了一个简单的反向传播神经网络 该网络使用 sigmoid 激活函数 随机权重初始化和学习 梯度动量 当配置 2 个输入 2 个隐藏节点和 1 个时 它无法学习 XOR 和 AND 然而 它会正确地学习 OR 我
  • Keras:模型准确率在达到 99% 准确率后下降,损失为 0.01

    我正在 keras 中使用改编的 LeNet 模型来进行二元分类 我有大约 250 000 个训练样本 比率为 60 40 我的模型训练得很好 第一个 epoch 的准确率达到 97 损失为 0 07 10 个 epoch 后 准确率超过
  • word2vec中单词的向量代表什么?

    word2vec https code google com p word2vec 是 Google 的开源工具 它为每个单词提供一个浮点值向量 它们到底代表什么 还有一篇论文关于段落向量 http cs stanford edu quoc
  • Theano 中的名称冲突

    我正在尝试在模块中导入 theano 但我得到了回溯 File media tarun 6A86CA8286CA4DEF develop pydy pydy codegen code py line 16 in
  • 在 model.fit() 期间记录 Keras 中每个时期的计算时间

    我想比较不同模型之间的计算时间 在拟合期间 每个时期的计算时间被打印到控制台 Epoch 5 5 160000 160000 10s 我正在寻找一种方法来存储这些时间 其方式与模型指标类似 模型指标保存在每个时期并可通过历史对象获取 尝试以
  • BatchNorm 动量约定 PyTorch

    Is the 批归一化动量约定 http pytorch org docs master modules torch nn modules batchnorm html 默认 0 1 与其他库一样正确 例如Tensorflow默认情况下似乎
  • Keras,训练模型后如何预测?

    我正在使用 reuters example 数据集 它运行良好 我的模型已经过训练 我阅读了有关如何保存模型的信息 以便稍后加载它以再次使用 但如何使用这个保存的模型来预测新文本呢 我用吗models predict 我必须以特殊方式准备这
  • Tensorflow Inception 多 GPU 训练损失未求和?

    我正在尝试检查多个 GPU 在一台机器上 的 Tensorflow 初始代码 我很困惑 因为据我所知 我们从不同的塔 又名 GPU 中得到了多次损失 但是loss评估的变量似乎只是最后一个塔的变量 而不是所有塔的损失之和 for step
  • caret::train:为 mlpWeightDecay(RSNNS 包)指定更多非调整参数

    我在使用插入符号包和 RSNNS 包中的 mlpWeightDecay 方法指定学习率时遇到问题 mlpWeightDecay 的调整参数是大小和衰减 将大小保持为 4 并在 c 0 0 0001 0 001 0 002 上调整衰减的示例
  • 帮助我在 Python 中实现反向传播

    EDIT2 新的训练集 Inputs 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 0 1 0 0 0 1 0 1 0 1 0 2 0 1 0 3 0 1 0 4 0 2 0 0 0 2 0 1 0 2 0 2
  • ImportError:现有延迟链接器编译文件的版本检查。寻找版本 0.211,但没有找到

    C Users meela Anaconda3 python exe E TTIGAN test py You can find the C code in this temporary file C Users meela AppData
  • Keras 导入错误 Nadam

    我在尝试导入 Keras 模块 Nadam 时遇到导入错误 gt gt gt from keras optimizers import Nadam Traceback most recent call last File
  • R中的神经网络包出现大错误

    我正在尝试弄清楚如何使神经网络包发挥作用 我用我创建的数据及其结果 大约 50 行数据和三列 第四列是我想要的结果 它是通过简单的数学执行 如对其他三列求和 得出的 进行了一些测试 到目前为止一切顺利 然后我决定将这个包应用到真实数据上 我
  • 我可以在反向传播期间(有选择地)反转 Theano 梯度吗?

    我热衷于利用最近论文中提出的架构 通过反向传播进行无监督域适应 http arxiv org pdf 1409 7495 pdf 在 Lasagne Theano 框架中 这篇论文的有点不同寻常之处在于它包含了一个 梯度反转层 invert
  • Encog - 如何加载神经网络的训练数据

    The NeuralDataSet我在实际中看到的对象除了 XOR 之外什么都没有 它只是两个小数据数组 我无法从文档中找出任何内容MLDataSet 似乎所有内容都必须立即加载 但是 我想循环遍历训练数据 直到到达 EOF 然后将其算作
  • 如何将神经网络的输出限制在特定范围内?

    我正在使用 Keras 进行回归任务 并希望将输出限制在一个范围内 例如 1 到 10 之间 有没有办法保证这一点 像这样编写自定义激活函数 a simple custom activation from keras import back
  • 如何使用一个模型中间层的输出作为另一个模型的输入?

    我训练一个模型A并尝试使用中间层的输出name layer x 作为模型的附加输入B 我尝试像 Keras 文档一样使用中间层的输出https keras io getting started faq how can i obtain th

随机推荐

  • .net中连续内存存储的误解?

    http msdn microsoft com en us library ms379570 v vs 80 aspx http msdn microsoft com en us library ms379570 v vs 80 aspx
  • R 中的命名空间和泛型函数

    这个问题有点后续这个问题 https stackoverflow com questions 55361133 how to make your ranking values show integer without decimals in
  • Facebook python sdk使用营销api或图api

    我一直在使用facebook python SDK花了近 6 个月的时间来构建一个产品 我拥有营销 API 的开发访问权限 它经常错误地指出已超出速率限制 但是当我检查营销 API 仪表板时 它说没有足够的可用数据 所以我真的很困惑 SDK
  • 输入数据库时​​拆分文本框中的文本

    当插入 MS Access 数据库 时 如何将文本框中的单词拆分或放入另一行 例如 我的文本框有这些词 ABC DEF 生长激素指数 JKL 当用户按下回车按钮时 以下单词将被插入到文本框中 但每个单词都会在一个新行中 例如 ABC 将位于
  • 为什么 RestTemplate 不将响应表示绑定到 PagedResources?

    我正在使用 spring data rest 将实体公开为 分页 剩余资源 一切正常 但是当我通过以下方式请求数据时RestTemplate 我得到了一个无用的 HATEOAS JSON 我没有要求 JSON 似乎是一个 PagedReso
  • 聚合联系人会自动添加吗?

    您一定也在其他地方看到过这段代码 但显然这个异常没有答案 编辑 如果您来这里寻找通过 vcardio 恢复联系人的解决方案 这就是它 我在使用时得到了这个vCardIO http code google com p vcardio Andr
  • HTML 表格换行列

    我有一个表 用户将数据输入到列中 每次用户输入数据时都会创建一个新列 一段时间后 他们有大量的专栏 我需要它们换行 我知道如何将文本换行在列内 但我需要将整个列换行在第一列下方 依此类推 您不应该为此使用表格 您应该使用具有 float l
  • 是否可以将 WPF Combobox.SelectedValue 绑定到多个 ObjectDataProvider?

    尝试确定是否可以使用 XAMAL 绑定将 ComboBox 的 SelectedValue 绑定到多个 ObjectDataProvider 的输入 我查看了 MultiBinding 但这似乎将多个控件组合在一起 这并不完全是我今天想要的
  • 如何迭代嵌套的 stdClass? [复制]

    这个问题在这里已经有答案了 我有一个这样的对象 stdClass Object count gt 10 start gt 0 total gt 37 values gt Array 0 gt stdClass Object key gt 5
  • PHP:向网址添加参数?

    如果我有网址mysite com test php id 1 The id在页面加载时设置 可以是任何内容 那里还可能有其他人 例如 id 1 sort new 有没有办法只在末尾添加另一个而不先找出其他人是什么 然后构建新的网址 谢谢 作
  • 当必须同时使用 Git 和 Subversion 时如何处理 Git-svn

    Update 更详细地说 我尝试在家使用纯 Git 的原因是 我的公司希望迁移到 Git 但经理不愿意进行更改 因为开发人员不了解我们自己的存储库上的 Git 所以 我尝试做的是 我尝试让每个人都使用 Pure git 同时有人可以在这个学
  • 将解决方案升级到 .NET Framework 4.5 后,每日部署停止工作

    我们已经成功地使用 TFS2010 中的 msdeploy 每天更新我们的开发网站 在我们升级到 VS2012 我们的应用程序从 NET Framework 4 0 到 4 5 以及 ASP NET MVC 从 3 0 到 4 0 之前 这
  • 为什么受保护的 C++-Cli 析构函数不会导致编译错误?

    如果我编译并运行以下命令 using namespace System ref class C1 public C1 Console WriteLine L Creating C1 protected C1 Console WriteLin
  • Windows.Forms Visual Studio,如何直接在第一个窗口上打开第二个窗口?

    如何在第一个窗口的正上方打开第二个窗口 而不是在默认位置稍微对角地向右下或向后打开 我只是想制作一些可以点击的屏幕 我还应该这样做吗 为什么CenterParent不这样做呢 那么 CenterParent 会做什么呢 尝试将新表单的位置设
  • 制作 SQL Server 转储并将该转储导入另一个 SQL Server 的最佳(最简单)方法

    我想从一台服务器在 SQL Server 中实现数据库导出 转储 并将该转储导入到另一台 SQL Server 中 并且不一定使用相同的架构名称 例如 如果我准备了一个数据库 其中包含用于为新客户实施新数据库的所有数据集 则该数据库名为 D
  • 在 KRL 中如何获取当前的年、月、日?

    我正在开发一个应用程序 需要获取当前的年 月和日 有没有办法在规则的前块中获取此信息 我可以以字符串或数字或两者的形式获取此数据吗 目前有时间函数记录在http docs kynetx com docs Time http docs kyn
  • SSIS 脚本编辑器抛出异常

    我有 SQL Server 2012 SSIS SSDT 和 Visual Studio 2010 我可以创建一个新的 SSIS 包并添加脚本任务 但如果我尝试打开该脚本任务的脚本编辑器 则会收到以下错误 TITLE Microsoft V
  • 使用 simple_form 条目输入空数组值

    我对 Rails 和 simple form 仍然很陌生 并且一直在尝试实现多重选择选项来为用户提供多个角色 当前输入看起来像这样 所以 这确实有效 但在数组的开头包含一个空值 secondary
  • Android Studio 中的多个光标会自动出现在每个匹配的文本处吗?

    我一直在使用多个光标ALT SHIFT 有时我需要大约 20 个光标 并且希望它们位于文本同一部分的开头 每次都这样做很乏味 这有捷径吗 就像想象文件中有 20 个文本 foo 的实例 那么我只想选择一个 理想情况下它应该自动为同一位置的所
  • 我可以在反向传播期间(有选择地)反转 Theano 梯度吗?

    我热衷于利用最近论文中提出的架构 通过反向传播进行无监督域适应 http arxiv org pdf 1409 7495 pdf 在 Lasagne Theano 框架中 这篇论文的有点不同寻常之处在于它包含了一个 梯度反转层 invert