Go debug

Submitted by Lizhe on Mon, 08/28/2017 - 12:08

首先你需要知道几个概念

Go语言输出的exe需要使用gdb(The GNU Project Debugger) 来调试

gdb调试时如果go是64位的, 那么对应的gdb也需要使用64位的

在windows下使用gdb需要gdb.exe, 但是有些版本可能不兼容,如果发现莫名其妙的错误可以尝试换个版本,如果你找不到可用版本我推荐你直接使用liteide自带的版本

 

1 使用liteide 调试

下载liteide    http://liteide.org/en/

然后需要一些简单配置

点击那个console图标,然后配置

474

Go 并发

Submitted by Lizhe on Thu, 08/24/2017 - 15:41

Go语言最大的一个特点就是对并发的原生支持

Go的并发指的是能让某个函数独立于其他函数运行的能力.

当一个函数创建为goroutine时, Go会将其视为一个独立的工作单元. 这个单元会被调度到任何可用的逻辑处理上执行.

Go的运行时调度器能管理被创建的goroutine并为他们分配执行时间.

Go基于叫做CSP ( Communicating Sequential Processes ) 的并发同步模型来保证数据的线程安全, CSP是一种消息传递模型, 通过在goroutine之间传递数据来传递消息,而不是对数据进行加锁来来实现同步访问, 用于传递数据的关键数据类型叫做channel

package main

import (
    "fmt"
    "runtime"
    "sync"
)

Go init函数

Submitted by Lizhe on Thu, 08/24/2017 - 12:24

init函数和main函数一样是go语言中的保留函数,由go自动调用

main函数只能应用于main包中, 但是init函数可以使用在任意包中

init函数会在包被导入时自动执行(在常量和变量初始化之后)

 

我们使用下面的例子进行验证

C:\DEV\workspace_angularjs\GoHelloInit\src\main\main.go

package main

import (
    t "testinit"
)

func main(){
    t.SayHello()
}

C:\DEV\workspace_angularjs\GoHelloInit\src\testinit\app.go

Go语言的微服务搭建

Submitted by Lizhe on Wed, 08/23/2017 - 18:02

 

Negroni是一个第三方库,用于在Go内置的net/ http包上构建路由接口

gorilla/mux是一个强大的路由,小巧但是稳定高效,不仅可以支持正则路由还可以按照Method,header,host等信息匹配,可以从我们设定的路由表达式中提取出参数方便上层应用,而且完全兼容http.ServerMux

 

package main

import (
    service "service"
)

func main(){
    port := "8888"
    server := service.NewServer()
    server.Run(":"+port)
}

 

Tensorflow 对数几率回归

Submitted by Lizhe on Tue, 08/22/2017 - 13:47

线性回归模型所预测的是一个连续值或任意实数

对数几率回归则用于预测 Y/N 

f(x) = 1/(1+e-x)

log

随着x值(横轴)的变化, y值(纵轴)会在0~1 这个区间内变化, 这里1表示Y, 0表示位N 

这个函数接收单个输入值所以这里如果我们需要使用多个输入值的话,需要将多个值合并成单个值使用

例如如果数据中是 

姓名    年龄    性别

Tom    20       Male

可能需要合并成 Tom_20_Male之后才能放入上面的公式参与计算

这里的例子是计算泰坦尼克的乘客的幸存概率,原始数据为

Tensorflow 线性回归

Submitted by Lizhe on Fri, 08/18/2017 - 11:31

在有监督学习问题中, 线性回归是一种最简单的建模手段.

给定一个数据点集合作为训练集, 线性回归的目标是找到一个与这些数据最为吻合的线性函数.

y(x1,x2,x3,...,xk) = w1x1+w2x2+w3x3+...+wkxk+b

Y 为待预测值

X 是一组独立的预测变量

w 为权值 (可学习)

b 为偏移量 (可学习)

上面的公式用代码表示应该是

Tensorflow 有监督学习

Submitted by Lizhe on Fri, 08/18/2017 - 09:20

有监督的学习在于

使用某个带标注信息的输入数据集合(其中的每个样本都标注了真是的或者期望的输出), 去训练一个推断模型,

该模型能够覆盖一个数据集, 并可对不存在于初始训练集合中的新样本的输出进行干预

这个推断模型实际上是一系列的数学运算, 运算使用的公式是固定的,但是参与运算的值 都是模型的参数, 在训练过程中会被不断更新, 以使模型能够学习,并对其输出进行调整

462

首先需要对模型参数进行初始化. 通常采用对参数随机赋值的方法, 但对于比较简单的模型,也可以将各个参数的初始值全部设置为0

读取训练数据(包括每个数据样本及其期望输出). 通常人们会在这些数据送入模型之前随机打乱样本的次序

在训练数据上执行推断模型. 这样, 在当前模型的参数配置下, 每个训练样本都会得到一个输出值

Tensorflow Summary

Submitted by Lizhe on Thu, 08/17/2017 - 17:27

直接上例子

import tensorflow as tf

data = tf.Variable(0, trainable=False)
increment_data = tf.assign_add(data, tf.constant(1))
tf.scalar_summary('increment_data', data)

sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)

summary_writer = tf.train.SummaryWriter('./my_graph', sess.graph)

Tensorflow Name Scope

Submitted by Lizhe on Thu, 08/17/2017 - 16:50

Name scope 是TensorFlow数据流图的核心构件.

当节点过多时, 我们需要一种机制可以有效的组织节点, 降低图的复杂性

Name scope可以帮助用户组织流程图

Name scope允许用户将Op划分到一些较大的, 可以命名的语句块中, 当使用TensorBoard加载数据流图时,

每个名称的作用域都将对其自己的Op进行封装, 从而得到更好的可视化效果

看下面的例子

Tensorflow Variable

Submitted by Lizhe on Thu, 08/17/2017 - 11:51

Tensor对象和Operation对象都是不可变的,如果需要可变对象需要使用Variable对象

a=tf.Variable(3, name="my_variable")

variable对象可以代替Tensor对象传入Tensorflow函数或Operation中使用

例如

add = tf.add(a, 5)

variable对象的初始值通常是0,1或者随机数填充的阶数较高的张量,不过可以使用辅助Op来初始化特定的值

tf.zeros()