参考:https://www.tensorflow.org/extras/candidate_sampling.pdf
At training time, we discarded the object bounding boxes to conform with the weakly supervised setting ,应该是WSOD和WSPP两个过程都没有用bounding box的标签。
那为什么又说是image-level的分类或者标注呢?因为标注只给了很少的信息,如果一个物体出现在一张图片中,那么图像的标注就是positive,否则为negtive。而分类是要在这种image-level的标注下找到一个物体对应的region proposal。
网络分成了两个部分,两个都是弱监督的方法,一个进行物体检测,另一个进行关系分类。
参考另一篇WSDDN的文章:
一个用来选取关系对,另一个用来进行关系分类:
在进行softmax之前,如何计算这两个分数:
主要考虑到两方面的因素:position和pair对的顺序问题:
Follow[34],Multi-task loss:
根据[10]又考虑了位置上的关系(上面这个loss不能保证空间位置上的平滑性):
1)物体检测结果,提升主要来自于全卷积网络,而且WSOD往往能发现discriminative parts of objects
2)谓词检测结果,结果说明考虑position和sequence的网络要更优,用全连接层的要优于pooling-based methods,本文用这类方法是为了减少计算量
Supervised-PPR-FCN优于VtransE,因为其pair-wise roi pooling,有用的spatial context 速度相对于VtransE更快,参数更少
数据:
VG is annotated by crowd workers and thus the relations labeling are noisy, e.g., free-language and typos. Therefore, we used the20pruned version provided by Zhang et al. [48].
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>result;
sort(nums.begin(), nums.end());
map<string, bool>m;
for (int i = 0; i<nums.size(); i++)
{
for (int j = i + 1; j<nums.size(); j++)
{
for (int k = j + 1; k<nums.size(); k++)
{
vector<int>a;
if (nums[i] + nums[j] + nums[k] == 0)
{
a.push_back(nums[i]);
a.push_back(nums[j]);
a.push_back(nums[k]);
string s;
for (int i = 0; i < 3; i++)
{
s += to_string(a[i]);
}
if (m.find(s)==m.end())
{
result.push_back(a);
m[s] = true;
}
}
}
}
}
return result;
}
};
数组排序之后,能保证输出的结果和测试用例的结果是顺序一致的;只一层循环,另一层类似于两个数的和,头尾各一个指针,向内收缩。遇到相等的值就跳过。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>result;
sort(nums.begin(), nums.end());
int len = nums.size();
for (int i = 0; i<len; i++)
{
if (i > 0 && nums[i] == nums[i - 1])continue;
int l = i+1,r = len - 1;
while (l<r)
{
int tmp = nums[l] + nums[r] + nums[i];
if (tmp == 0)
{
vector<int>a;
a.push_back(nums[i]);
a.push_back(nums[l]);
a.push_back(nums[r]);
result.push_back(a);
l += 1;
r -= 1;
while ((l<r) &&(nums[l]==nums[l-1]))
{
l++;
}
while ((l<r) && (nums[r]==nums[r+1]))
{
r--;
}
}
else if(tmp<0)
{
l++;
}
else
{
r--;
}
}
}
return result;
}
};
思路
暴力求解
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len=s.length(),max_len=0,cur_len=0;
map<char,bool>m;
for(int i=0;i<len;i++)
{
if(cur_len>max_len)max_len=cur_len;
m.clear();
cur_len=0;
for(int j=i;j<len;j++)
{
if(m.find(s[j])==m.end())
{
m[s[j]]=true;
cur_len++;
}
else
{
break;
}
}
}
if(cur_len>max_len)max_len=cur_len;
return max_len;
}
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carray=0,idx=1;
ListNode*temp1=l1,*temp2=l2,*sum=NULL,*temp3=NULL;
while(temp1!=NULL||temp2!=NULL)
{
int temp_sum=0;
if(temp1!=NULL&&temp2!=NULL)
{
temp_sum=temp1->val+temp2->val+carray;
temp1=temp1->next;
temp2=temp2->next;
}
else if(temp1!=NULL)
{
temp_sum=temp1->val+carray;
temp1=temp1->next;
}
else
{
temp_sum=temp2->val+carray;
temp2=temp2->next;
}
if(temp_sum>9)
{
carray=1;
temp_sum%=10;
}
else
{
carray=0;
}
if(sum==NULL)
{
sum=new ListNode(temp_sum);
temp3=sum;
}
else
{
temp3->next=new ListNode(temp_sum);
temp3=temp3->next;
}
}
if(carray!=0)temp3->next=new ListNode(1);
return sum;
}
};