tensorflow学习笔记3

目的

  • 自定义损失函数2

教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#coding:utf-8
#目的:自定义成本函数,成本是9元,利润是1元
import tensorflow as tf
import numpy as np
BATCH_SIZE =8
SEED =23455
COST = 9
PROFIT =1

rdm= np.random.RandomState(SEED)
X = rdm.rand(32,2)
#构造目标结果集,(rdm.rand()/10.0-0.05)表示-0.05-0.05的随机数。y=x1+x2+随机噪音。
Y_ = [[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X]

#定义模型的输入,参数和输出,定义前项传播过程
#x和y占位符,由后面用数据填充
x= tf.placeholder(tf.float32,shape=(None,2))
y_= tf.placeholder(tf.float32,shape=(None,1))
# w1为2维1列的,标准差为1的原始数据,随机种子是1的w1初始化值
w1= tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
# 待拟合的公式为y=w1*x1+w2*x2
y = tf.matmul(x,w1)

#定义损失函数和反向传播
#损失函数,优化目标,均方误差公式计算
#loss_mse = tf.reduce_mean(tf.square(y_-y))
#自定义损失函数,reduce_sum表示求和
# tf.where类似?:运算,
# tf.greater()函数表示>
loss_mse = tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*COST,(y_-y)*PROFIT))
#定义梯度下降算法优化,
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)

with tf.Session() as sess:

init_op = tf.global_variables_initializer()
sess.run(init_op)
# print "w1 init :",sess.run(w1)
STEPS = 20000
for i in range(STEPS):
start =(i*BATCH_SIZE)%32
end= (i*BATCH_SIZE)%32+BATCH_SIZE
#把 构造的x,y结果集喂入模型,求得w1
sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
if i%500 == 0:
print "After %d training steps,w1 is:" %(i)
print sess.run(w1),"\n"

print "Final w1 is :\n",sess.run(w1)

阅读全文

TensorFlow学习笔记2

目的

  • 学习常用的损失函数
  • 学习自定义损失函数

教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#coding:utf-8
#目的:自定义成本函数,成本是1元,利润是9元
import tensorflow as tf
import numpy as np
BATCH_SIZE =8
SEED =23455
COST = 1
PROFIT =9

rdm= np.random.RandomState(SEED)
X = rdm.rand(32,2)
#构造目标结果集,(rdm.rand()/10.0-0.05)表示-0.05-0.05的随机数。y=x1+x2+随机噪音。
Y_ = [[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X]

#定义模型的输入,参数和输出,定义前项传播过程
#x和y占位符,由后面用数据填充
x= tf.placeholder(tf.float32,shape=(None,2))
y_= tf.placeholder(tf.float32,shape=(None,1))
# w1为2维1列的,标准差为1的原始数据,随机种子是1的w1初始化值
w1= tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
# 待拟合的公式为y=w1*x
y = tf.matmul(x,w1)

#定义损失函数和反向传播
#损失函数,优化目标,均方误差公式计算
#loss_mse = tf.reduce_mean(tf.square(y_-y))
#自定义损失函数,reduce_sum表示求和
# tf.where类似?:运算,
# tf.greater()函数表示>
loss_mse = tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*COST,(y_-y)*PROFIT))
#定义梯度下降算法优化,
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)

with tf.Session() as sess:

init_op = tf.global_variables_initializer()
sess.run(init_op)
# print "w1 init :",sess.run(w1)
STEPS = 20000
for i in range(STEPS):
start =(i*BATCH_SIZE)%32
end= (i*BATCH_SIZE)%32+BATCH_SIZE
#把 构造的x,y结果集喂入模型,求得w1
sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
if i%500 == 0:
print "After %d training steps,w1 is:" %(i)
print sess.run(w1),"\n"

print "Final w1 is :\n",sess.run(w1)

阅读全文

tensorflow学习笔记1

目的

使用Python构建一层的神经网络模型

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#coding:utf-8
import tensorflow as tf
import numpy as np
BATCH_SIZE =8
SEED =23455

rdm= np.random.RandomState(SEED)
X = rdm.rand(32,2)
#构造目标结果集,(rdm.rand()/10.0-0.05)表示-0.05-0.05的随机数。y=x1+x2+随机噪音。
Y_ = [[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X]

#定义模型的输入,参数和输出,定义前项传播过程
#x和y占位符,由后面用数据填充
x= tf.placeholder(tf.float32,shape=(None,2))
y_= tf.placeholder(tf.float32,shape=(None,1))
# w1为2维1列的,标准差为1的原始数据,随机种子是1的w1初始化值
w1= tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
# 待拟合的公式为y=w1*x
y = tf.matmul(x,w1)

#定义损失函数和反向传播
#优化目标,均方误差公式计算(y_-y)^2
loss_mse = tf.reduce_mean(tf.square(y_-y))
#定义梯度下降算法优化,
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss_mse)

with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
# print "w1 init :",sess.run(w1)
STEPS = 20000
for i in range(STEPS):
start =(i*BATCH_SIZE)%32
end= (i*BATCH_SIZE)%32+BATCH_SIZE
#构造的x,y结果集喂入模型,求得w1
sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
if i%500 == 0:
print "After %d training steps,w1 is:" %(i)
print sess.run(w1),"\n"

print "Final w1 is :\n",sess.run(w1)

阅读全文

进程间通信—shm

目的

学习shm相关API

read端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
char name[8];
int age;
} people;
int main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people *p_map;
char pathname[30] ;
strcpy(pathname,"/tmp") ;
// 参数fname是指定的文件名,这个文件必须是存在的而且可以访问的。id是子序号,它是一个8bit的整数。即范围是0~255
// key_t ftok(const char *pathname, int proj_id);
// 执行成功,则会返回key_t键值,否则返回-1
// ftok根据路径名,提取文件信息,再根据这些文件信息及project ID合成key,该路径可以随便设置。
// 该路径是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关。
// proj_id是可以根据自己的约定,随意设置。这个数字,有的称之为project ID; 在UNIX系统上,它的取值是1到255;
key = ftok(pathname,0x033);
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key=%d\n", key) ;
// 得到一个共享内存标识符或创建一个共享内存对象
// 会建立新共享内存对象,
// size_t 新建的共享内存大小,以字节为单位,只获取共享内存时指定为0
// shmflg 取共享内存标识符,若不存在则函数会报错 IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符,IPC_CREAT|IPC_EXCL:如果内核中不存在键值 与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存则报错
// int shmget(key_t, size_t, int shmflg);
shm_id = shmget(key,0, 0);
if(shm_id == -1)
{
perror("shmget error");
return -1;
}
printf("shm_id=%d\n", shm_id) ;
// 把共享内存区对象映射到调用进程的地址空间
// 连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问
// shmid 共享内存标识符
// shmaddr 指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置
// shmflg SHM_RDONLY:为只读模式,其他为读写模式.
// void *shmat(int shmid, const void *shmaddr, int shmflg)
// 成功:附加好的共享内存地址
// 出错:-1,错误原因存于error中
p_map = (people*)shmat(shm_id,NULL,0);
for(i = 0;i<3;i++)
{
printf( "name:%s\n",(*(p_map+i)).name );
printf( "age %d\n",(*(p_map+i)).age );
}
// 断开共享内存连接
// int shmdt(const void *shmaddr)
// shmaddr:连接的共享内存的起始地址
// 成功:0
// 出错:-1,错误原因存于error中
if(shmdt(p_map) == -1)
{
perror("detach error");
return -1;
}
return 0 ;
}

阅读全文

tensorflow so调式

背景

  1. 如何调式tensorflow源码

解决办法

替换成可debug的so

    阅读全文

    Native_Crash问题排查

    常用的工具

    • nm
    • readdef
    • addr2line 该工具可以把crash地址信息转换为代码的行号。

    阅读全文

    tensorflow原理笔记

    目的

    本学习教程为了记录当前学习过程,过程中理解可能会有问题。了解Android TF 的主要结构和主逻辑

    当前的主要架构

    Android 主要有两层,一层是TF Inference,一层是TF的Core层

    阅读全文