杂物

随便写写,慢慢记录

此栏目专门用于记录一些阅读代码过程中看到的一些比较奇怪的写法,之前看到的一些奇怪的写法没能记录下来现在可能又看不懂了,但是单独开一篇专栏又很费时间,这个想法就作罢了很久,现如今以随笔或者说摘录的形式呈现出来,后续慢慢补充。

1.while(~scanf("%d",m));

scanf返回输入值的个数,没有输入值会返回-1,因此使用按位取反~(-1)=0,表示当前没有输入,可以退出

2.指针的易错点

在写代码的时候不想用全局变量,想要动态内存来生成数组,然而在将指向数组的指针传出来的时候,遇到了巨大的问题

#include <stdio.h>
#include <stdlib.h>
void func(char * p);
int main(){
	char * p = NULL;
	func(p);
	//为了保证不被缓冲IO影响,在后面添加 '
'刷新缓冲区
	printf("%s
",p);
}
void func(char * p){
	p=(char*)calloc(1024,sizeof(char));
	sprintf(p,"%s","hello world");
}

大伙可以先猜猜会输出什么----> hello world?
直接输出了null
搞了好久才发现问题出在了C语言中函数参数传递是值传递,会有一个拷贝的过程,也就是说进入了函数之后

p=(char*)calloc(1024,sizeof(char));

这句话并没有对原先的p产生影响,而是把复制之后的p(可以看成p1)的值给覆盖了,导致原先的p没有改变

3.数组的名字

int array[4]={0};

在上面的简单代码中
array 和 &array 的值是相同的,但是含义是不同的
array:数组的第一个元素的地址
&array:整个数组的地址
而在进行加法的时候 ' + '秉持的原则是 T+1 --> sizeof(T)+1
而sizeof对于数组来说又比较特殊
sizeof后面跟着数组的地址的时候返回数组的大小,跟着元素的地址的时候返回元素的大小
导致了如下情况

(array+1的地址) + sizeof(int)*4 = (&array+1的地址) = (&array[0]+1的地址) + sizeof(int)*4

3. keras,tensorflow中经常出现的axis的理解

这个东西可把我给搞坏了,假设这么一个场景,三维的数据集,现在一行代码中要求你沿着axis=1进行求和,而这花费了我不少时间去在三维空间中想象到底是一个什么过程,于是去百度其他人的经验分享,不禁感叹人外有人,天外有天啊。
下面是解释说明:
给定三维数据集A,那么我们的数据下标是以(a,b,c)的形式出现的,axis=(0,1,2)就是对应a,b,c所对应的维度,而接下来我们要做的操作就是沿着这个axis来操作的
for example
我们要对数据集A在axis=1的维度上进行求和操作,那么我们要做的就是

for (int j = 0 ; j < num_j ; j++){
  Result[i][k] += A[i][j][k]
}

4. batch、batch_size、SGD、mini-batch辨析

首先,忘记所有的batch、batch_size、SGD、mini-batch这些东西,统统从零开始
梯度下降分为三种方式:

  • Batch-Gradient-Descent
    一次将所有的数据喂给模型,让他训练,喂完之后才更新参数
  • Stochastic Gradient Descent
    一次就给一个数据给模型,给了就更新参数
  • mini-batch Gradient Descent
    一次给的数据量介于全部和1之间,然后更新参数

至于这个为什么一般的model.fit()函数里面还有一个batch_size呢?
因为有时候数据集太大并不能一次性就写入内存,需要分批次导入,于是就有了batch_size,容易和batch gradient descent混淆,注意一下

原文地址:https://www.cnblogs.com/seaman1900/p/14725473.html