首页
常用链接
关于
Search
1
Pytorch DDP
2,414 阅读
2
Pytorch 常见问题
1,464 阅读
3
视频时序切分
1,252 阅读
4
2022年微信大数据比赛(多模态短视频分类)总结
966 阅读
5
中文场景下的CLIP图文预训练
955 阅读
分布式训练
AIGC
多模态理解
阅读
论文阅读
算法基础
C++
Python
LeetCode
Shell
Pytorch
Segmentation
其他
广告
购房/投资
职场经验复盘
广告基础知识
推荐算法
创意优选
默认分类
Search
标签搜索
论文速读
AIGC
人工智能
python
视频生成
Pandas
DiT
图像生成
transformer
视觉传统方法
创意质量
git
shell
视频理解
Pytroch
nlp
DDP
图像自监督预训练
安装包
视频流行度
Jefxiong
累计撰写
57
篇文章
累计收到
8
条评论
首页
栏目
分布式训练
AIGC
多模态理解
阅读
论文阅读
算法基础
C++
Python
LeetCode
Shell
Pytorch
Segmentation
其他
广告
购房/投资
职场经验复盘
广告基础知识
推荐算法
创意优选
默认分类
页面
常用链接
关于
搜索到
31
篇与
算法基础
的结果
2016-09-01
一分钟实现python安装包开发
1. 实现步骤: 创建一个setup.py文件。这个文件是Python安装包的核心,用于定义包的元数据、依赖关系和安装过程 使用setuptools、 wheel构建安装包 2. 举例:以实现函数计时功能为例 创建一个名为timer_decorator的Python包,它提供了一个计时器装饰器,用于测量函数的运行时间。 创建一个名为timer_decorator的目录。 在timer_decorator目录中创建一个名为__init__.py的文件,这将使其成为一个Python包。在__init__.py文件中,编写计时器装饰器的代码: import time def timer_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} took {end_time - start_time:.2f} seconds to run.") return result return wrapper 创建一个setup.py文件,如下所示: from setuptools import setup setup( name='timer_decorator', version='0.1', py_modules=['timer_decorator'], install_requires=[ # 该项目没有依赖项 ], entry_points={ 'console_scripts': [ # 该项目没有可执行脚本 ], }, ) 基于setup.py创建whl安装文件 python setup.py timer_decorator 使用方法: from timer_decorator import timer_decorator @timer_decorator def my_function(): # Your code here
2016年09月01日
101 阅读
0 评论
0 点赞
2016-09-01
Handcraft features
Take-Home Message LBP 不受光照影响,运算快,适用在人脸 SIFT是基于关键点的特征描述,具有旋转、尺度、光照不变性(常用欧式距离比较距离做匹配) HOG 是基于块的梯度直方图特征描述,适用在人体检测(常作为分类器输入特征)
2016年09月01日
246 阅读
0 评论
0 点赞
2016-09-01
基础知识整理
深度学习(计算机视觉) 分类(网络结构发展过程) AlexNet --> VGG/GoogleNet --> ResNet/DenseNet BatchNorm / LayerNorm / InstanceNorm / GroupNorm 归一化能够加速网络收敛,归一化后梯度更稳定,能够采用更大的学习率 四种归一化的方式不同之处在于归一化所采用的统计量(均值,方差)不同 BatchNorm使用NHW的统计量$R^{C}$ LayerNorm使用CHW的统计量$R^{N}$ InstanceNorm使用HW的统计量$R^{N * C}$ GroupNorm使用GHW的统计量$R^{N * C/G}$ BatchNorm 在训练过程中通过滑动平均进行统计,增加了训练的随机性,而其它几种归一化的方式都是由单个样本得到的统计量,可能导致泛化能力比BatchNorm弱 轻量化网络 squeezeNet shuffleNet MobileNet 胶囊网络 几种特殊的卷积 空洞卷积 转置卷积 可分离卷积 模型量化/压缩
2016年09月01日
306 阅读
0 评论
0 点赞
2016-09-01
gtest in caffe
为了验证自己编写层的正确性,我们通过写xx_layer_test.cpp中测试层的前向和反向操作。caffe中运用Google C++ Testing Framework 来进行测试。 使用gtest(Google Test)使得程序的主体与测试独立开。使用gtest时,我们需要编写断言(assertion),判断条件是否成立。Google Test中的断言类似于函数调用,例如ASSERT_EQ(val1,val2) 判断两个数是否相等。gtest中的宏,我们只要定义即可,不用显示地调用,gtest内部通过RUN_ALL_TESTS()为我们隐式地调用了这些测试。 TEST宏 以测试n!序列(1,2!,3!,...,n!)为例,介绍 TEST宏的用法 int Factorial(int n); // Returns the factorial of n // Tests factorial of 0. TEST(FactorialTest, HandlesZeroInput) { EXPECT_EQ(1, Factorial(0)); } // Tests factorial of positive numbers. TEST(FactorialTest, HandlesPositiveInput) { EXPECT_EQ(1, Factorial(1)); EXPECT_EQ(2, Factorial(2)); EXPECT_EQ(6, Factorial(3)); EXPECT_EQ(40320, Factorial(8)); } TEST宏的第一个参数相同,表明它们属于同一组测试,第二个参数表明具体的测试实例(处理0输入,处理正数输入),宏的内部为需要测试的C++语句。 TEST_F宏 如果想要在不同的测试的case中访问通过一个变量或对象,我们可以定义一个测试类,将这些变量或对象定义成测试类中的成员变量。这个测试类,gtest中把它叫做Test Fixtures,并且gtest已经实现了它的父类::testing::Test, 我们只需要从该父类继承,便可节省许多代码量。 以对队列测试为例: template <typename E> // E is the element type. class Queue { public: Queue(); void Enqueue(const E& element); E* Dequeue(); // Returns NULL if the queue is empty. size_t size() const; }; class QueueTest : public ::testing::Test { protected: virtual void SetUp() { q1_.Enqueue(1); q2_.Enqueue(2); q2_.Enqueue(3); } // virtual void TearDown() {} Queue<int> q0_; Queue<int> q1_; Queue<int> q2_; }; TEST_F(QueueTest, IsEmptyInitially) { EXPECT_EQ(0, q0_.size()); } TEST_F(QueueTest, DequeueWorks) { int* n = q0_.Dequeue(); EXPECT_EQ(NULL, n); n = q1_.Dequeue(); ASSERT_TRUE(n != NULL); EXPECT_EQ(1, *n); EXPECT_EQ(0, q1_.size()); delete n; n = q2_.Dequeue(); ASSERT_TRUE(n != NULL); EXPECT_EQ(2, *n); EXPECT_EQ(1, q2_.size()); delete n; } TEST_F与TEST 使用的方法类似,不同之处在于,TEST_ F的第一个参数必须是类名。 TYPED_TEST 宏 这个宏与C++中的template类似,即我们希望利用相同的算法流程处理不同类型的变量。废话不多说,直接上例子。 template <typename T> class FooTest : public ::testing::Test { public: ... typedef std::list<T> List; static T shared_; T value_; }; typedef ::testing::Types<char, int, unsigned int> MyTypes; TYPED_TEST_CASE(FooTest, MyTypes); TYPED_TEST(FooTest, HasPropertyA) { ... } TYPED_TEST(FooTest, HasPropertyB) { ... } 首先,与TEST_F一样,我们首先从::testing::Test 中继承,注意到我们typedef了一个类型的列表为MyTypes, 并且调用TYPED_TEST_CASE 宏告诉gtest 我们需要测试这个列表中所有的类型。 gtest的调用 同样,以一个实例来介绍,gtest在cpp文件中如何调用测试 /* * gtest_main.cpp * * Created on: 23 Oct, 2016 * Author: lab-xiong.jiangfeng */ #include "gtest/gtest.h" #include <cmath> double square_root(const double x){ if(x<0){ return -1; } return sqrt(x); } TEST(SquareRootTest,PositiveNos){ EXPECT_EQ(18.0,square_root(324.0)); EXPECT_EQ(25.4,square_root(645.16)); EXPECT_EQ(50.332,square_root(2533.310224)); } TEST(SquareRootTest,ZeroAndNegtiveNos){ ASSERT_EQ(0.0,square_root(0.0)); ASSERT_EQ(-1,square_root(-22.0)); } int main(int argc,char **argv){ ::testing::InitGoogleTest(&argc , argv); //Note that RUN_ALL_TEST automatically detects and runs all the tests define using TEST macro return RUN_ALL_TESTS(); } main函数以上的内容我们都已经见过了,在main函数中,我们看到两个新的函数,InitGoogleTest 和RUN_ALL_TESTS 。顾名思义,InitGoogleTest 从命令行中解析参数并初始化。RUN_ALL_TESTS 自动检测我们定义的TEST 、TEST_F 等宏,然后测试所有的case。 gtest的基础部分就这么多,更多高级的用法可以参考googletest/AdvancedGuide.md test_scale_layer 接下来以scale_layer为例,进一步理解caffe中的测试环节。 让我们一步一步分析test_scale_laye_.cpp的组成,首先包含一些必要的头文件 #include <algorithm> #include <vector> #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/layers/scale_layer.hpp" #include "caffe/test/test_caffe_main.hpp" #include "caffe/test/test_gradient_check_util.hpp" 这些头文件我们已经比较熟悉了,接下来就是要测试的类的定义了, template <typename TypeParam> class ScaleLayerTest : public MultiDeviceTest<TypeParam> { typedef typename TypeParam::Dtype Dtype; 乍一看,MultiDeviceTest是什么鬼。。原来它是继承自::testing::Test 的一个类,它的作用是把Caffe::set_mode() 封装到这个类的构造函数中,实现不同Device下的测试。 TYPED_TEST_CASE(ScaleLayerTest, TestDtypesAndDevices); TYPED_TEST_CASE是不是看起来很熟悉,没错,这就是这就是上面我们提到的TYPED_TEST的用法,为了只用一个函数测试float 和double类型(在CPU和GPU下),所以TestDtypesAndDevices 自然是要测试的类型列表。TestDtypesAndDevices的定义在在test_caffe_main.hpp 中, typedef ::testing::Types<CPUDevice<float>, CPUDevice<double>, GPUDevice<float>, GPUDevice<double> > TestDtypesAndDevices; template <typename TypeParam> struct CPUDevice { typedef TypeParam Dtype; static const Caffe::Brew device = Caffe::CPU; }; template <typename TypeParam> struct GPUDevice { typedef TypeParam Dtype; static const Caffe::Brew device = Caffe::GPU; }; 再接下来就是ScaleLayerTest的各种暴力测试,主要就是一些前向后向操作,具体内容,就自己看代码test_scale_layer.cpp慢慢消化吧。 TYPED_TEST(ScaleLayerTest, TestForwardEltwise) TYPED_TEST(ScaleLayerTest, TestForwardEltwiseInPlace) TYPED_TEST(ScaleLayerTest, TestBackwardEltwiseInPlace) TYPED_TEST(ScaleLayerTest, TestForwardEltwiseWithParam) TYPED_TEST(ScaleLayerTest, TestForwardBroadcastBegin) TYPED_TEST(ScaleLayerTest, TestForwardBroadcastMiddle) TYPED_TEST(ScaleLayerTest, TestForwardBroadcastMiddleInPlace) TYPED_TEST(ScaleLayerTest, TestBackwardBroadcastMiddleInPlace) TYPED_TEST(ScaleLayerTest, TestForwardBroadcastMiddleWithParam) TYPED_TEST(ScaleLayerTest, TestForwardBroadcastMiddleWithParamAndBias) TYPED_TEST(ScaleLayerTest, TestForwardBroadcastEnd) TYPED_TEST(ScaleLayerTest, TestForwardScale) TYPED_TEST(ScaleLayerTest, TestForwardScaleAxis2) TYPED_TEST(ScaleLayerTest, TestGradientEltwise) TYPED_TEST(ScaleLayerTest, TestGradientEltwiseWithParam) TYPED_TEST(ScaleLayerTest, TestGradientBroadcastBegin) TYPED_TEST(ScaleLayerTest, TestGradientBroadcastMiddle) TYPED_TEST(ScaleLayerTest, TestGradientBroadcastMiddleWithParam) TYPED_TEST(ScaleLayerTest, TestGradientBroadcastEnd) TYPED_TEST(ScaleLayerTest, TestGradientScale) TYPED_TEST(ScaleLayerTest, TestGradientScaleAndBias) TYPED_TEST(ScaleLayerTest, TestGradientScaleAxis2) THE END ~.~
2016年09月01日
296 阅读
0 评论
2 点赞
2016-09-01
卸载cortana
不需要cortana可以用windows的命令行执行 Get-AppxPackage -allusers Microsoft.549981C3F5F10 | Remove-AppxPackage
2016年09月01日
168 阅读
0 评论
0 点赞
2016-08-31
设计模式
设计模式 设计模式的目的是代码的可复用, 能够应对不断变化的需求, 关键的思想是抽象 设计模式应该遵循的原则 依赖倒置原则: 高层模块(稳定)依赖于抽象类(稳定), 具体实现细节(变化)依赖于抽象类 单一职责原则: 一个类只有单个引起它变化的原因, 变化的方向表示了该类的责任 Liskov替换原则(继承关系 vs 组合关系) 接口隔离原则: 接口应该小而完备 模板方法(Template Method) 定义整体的流程骨架(稳定), 将流程中的步骤(变化)延迟到子类中实现 早绑定 --> 晚绑定(虚函数 & 函数指针实现) 简单工厂模式 由一个工厂类+多个产品类构成(通常具有相同的父类), 工厂类根据输入参数创建对应的产品类的对象; 产品类负责产品算法的具体实现 工厂方法模式
2016年08月31日
191 阅读
0 评论
0 点赞
2016-01-01
Pytorch Tips
1. scatter target.scatter_(dim=1, index=index, src=src) # 使用 for 循环模拟 scatter_ 操作 for i in range(src.shape[0]): for j in range(src.shape[1]): target[i, index[i, j]] = src[i, j] target.scatter_(dim=0, index=index, src=src) # 使用 for 循环模拟 scatter_ 操作 for i in range(src.shape[0]): for j in range(src.shape[1]): target[index[i, j], j] = src[i, j]
2016年01月01日
61 阅读
0 评论
0 点赞
1
2
3
粤ICP备2021042327号