我是一名深度学习和 Tensorflow 初学者,我正在尝试在此 paper 中实现算法使用 tensorflow 。本文使用Matconvnet+Matlab实现,好奇Tensorflow有没有等价的功能来实现同样的事情。论文说:
The network parameters were initialized using the Xavier method [14]. We used the regression loss across four wavelet subbands under l2 penalty and the proposed network was trained by using the stochastic gradient descent (SGD). The regularization parameter (λ) was 0.0001 and the momentum was 0.9. The learning rate was set from 10−1 to 10−4 which was reduced in log scale at each epoch.
本文使用小波变换(WT)和残差学习方法(其中残差图像= WT(HR)- WT(HR'),HR'用于训练)。 Xavier 方法建议用
初始化变量正态分布stddev=sqrt(2/(filter_size*filter_size*num_filters)
Q1。我应该如何初始化变量?下面的代码是否正确?
weights = tf.Variable(tf.random_normal[img_size, img_size, 1, num_filters], stddev=stddev)
这篇论文没有详细解释如何构造损失函数。我找不到等效的 Tensorflow 函数来设置对数刻度的学习率(仅 exponential_decay)。我理解 MomentumOptimizer 等同于具有动量的随机梯度下降。
Q2:是否可以设置对数尺度的学习率?
Q3:如何创建上述损失函数?
我关注了这个website编写下面的代码。假设model()函数返回本文提到的网络并且lamda=0.0001,
inputs = tf.placeholder(tf.float32, shape=[None, patch_size, patch_size, num_channels])
labels = tf.placeholder(tf.float32, [None, patch_size, patch_size, num_channels])
# get the model output and weights for each conv
pred, weights = model()
# define loss function
loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=labels, logits=pred)
for weight in weights:
regularizers += tf.nn.l2_loss(weight)
loss = tf.reduce_mean(loss + 0.0001 * regularizers)
learning_rate = tf.train.exponential_decay(???) # Not sure if we can have custom learning rate for log scale
optimizer = tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss, global_step)
注意:因为我是一名深度学习/Tensorflow 初学者,所以我在这里和那里复制粘贴代码,所以如果可以的话请随时更正它;)
最佳答案
使用 tf.get_variable 或切换到 slim(它会自动为您进行初始化)。 example
你可以,但你需要吗?这不是您需要在此网络中解决的第一件事。请检查#3
但是,仅供引用,请使用以下符号。
learning_rate_node = tf.train.exponential_decay(learning_rate=0.001, decay_steps=10000, decay_rate=0.98, staircase=True)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate_node).minimize(loss)
一开始,你还没有写“pred”到“image”的转换到这个消息中(根据论文你需要应用减法和IDWT来获得最终图像)。
这里有一个问题,logits必须根据你的标签数据来计算。即,如果您将标记数据用作“Y:标签”,则需要编写
pred = model()
pred = tf.matmul(pred, weights) + biases
logits = tf.nn.softmax(pred)
loss = tf.reduce_mean(tf.abs(logits - labels))
这将为您提供 Y 的输出:要使用的标签
如果你的数据集的标记图像是去噪图像,在这种情况下你需要遵循这个:
pred = model()
pred = tf.matmul(image, weights) + biases
logits = tf.nn.softmax(pred)
image = apply_IDWT("X : input", logits) # this will apply IDWT(x_label - y_label)
loss = tf.reduce_mean(tf.abs(image - labels))
Logits 是网络的输出。您将使用这个结果来计算其余部分。您可以在此处添加一个 conv2d 层而不是 matmul,而无需批归一化和激活函数,并将输出特征数设置为 4。示例:
pred = model()
pred = slim.conv2d(pred, 4, [3, 3], activation_fn=None, padding='SAME', scope='output')
logits = tf.nn.softmax(pred)
image = apply_IDWT("X : input", logits) # this will apply IDWT(x_label - y_label)
loss = tf.reduce_mean(tf.abs(logits - labels))
此损失函数将为您提供基本的训练能力。但是,这是 L1 距离,可能会遇到一些问题 (check)。思考以下情况
假设您有以下数组作为输出 [10, 10, 10, 0, 0],并且您尝试实现 [10, 10, 10, 10, 10]。在这种情况下,您的损失是 20 (10 + 10)。然而,你有 3/5 的成功。此外,它可能表明有些过拟合。
对于相同的情况,考虑以下输出 [6, 6, 6, 6, 6]。它仍然有 20 (4 + 4 + 4 + 4 + 4) 的损失。但是,无论何时应用 5 的阈值,都可以获得 5/5 的成功。因此,这就是我们想要的情况。
如果你使用 L2 损失,对于第一种情况,你将有 10^2 + 10^2 = 200 作为损失输出。对于第二种情况,您将得到 4^2 * 5 = 80。 因此,优化器将尝试尽快摆脱#1 以获得全局成功,而不是某些输出的完美成功和其他输出的完全失败。您可以为此应用这样的损失函数。
tf.reduce_mean(tf.nn.l2_loss(logits - image))
或者,您可以检查交叉熵损失函数。 (它内部确实应用了softmax,不要两次应用softmax)
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, image))
关于python - Tensorflow:如何设置对数尺度的学习率和一些 Tensorflow 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47431649/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/