月度归档:2017年11月

TensorFlow学习笔记03

来自于官方教程中的一个例子,使用梯度下降算法进行线性逼近

import tensorflow as tf

# Model parameters
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W*x + b
y = tf.placeholder(tf.float32)

# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
  sess.run(train, {x: x_train, y: y_train})

# evaluate training accuracy
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

训练集

x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]

使用梯度下降算法,步进0.01,求方差最小化

optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

结果

W: [-0.9999969] b: [ 0.99999082] loss: 5.69997e-11

TensorFlow学习笔记02

在TensorFlow中文社区文档中,有一个使用TensorFlow API进行拟合的事例。但代码注释比较简略,导致学习的时候有些不明白,这里给出详细的注释。

import tensorflow as tf
import numpy as np

# 使用 NumPy 生成假数据(phony data), 总共 100 个点.
# np.random.rand(x, y)生成1个含有x个长度为y的array的array
x_data = np.float32(np.random.rand(2, 100)) 
# np.dot(x, y)对矩阵x和y进行矩阵乘运算
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 构造一个线性模型
# tf.zeros(shape)生成尺寸为shape的张量,值为0的张量
b = tf.Variable(tf.zeros([1]))
# tf.random_uniform(shape, min, max)生成尺寸为shape,值为min~max之间随机数的张量
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 最小化方差
'''
A loss function measures how far apart the current model is from the provided data. We'll use a standard loss model for linear regression, which sums the squares of the deltas between the current model and the provided data. linear_model - y creates a vector where each element is the corresponding example's error delta. We call tf.square to square that error. Then, we sum all the squared errors to create a single scalar that abstracts the error of all examples using tf.reduce_sum
'''
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 初始化变量
# 新版本中已经更新为tf.global_variables_initializer()
init = tf.initialize_all_variables()

# 启动图 (graph)
sess = tf.Session()
sess.run(init)

# 拟合平面
# python3中为range(min, max)
for step in xrange(0, 201):
    sess.run(train)
    if step % 20 == 0:
        #python3中为print()
        print step, sess.run(W), sess.run(b)

# 得到最佳拟合结果 W: [[0.100  0.200]], b: [0.300]

这个文档中使用的python版本为2.x,所以使用python3时会出现不兼容的情况。另外文档也比较老了,很多函数都已经更新。建议直接阅读官方文档。

numpy中的dot矩阵乘法

本来以为这辈子都和数学没啥关系了,结果遇到了np.dot()。

numpy中的“*”和“dot”运算是完全不同的,前者是直接计算,后者是矩阵相乘。

(venv) [root@localhost tf]# python
Python 3.4.5 (default, May 29 2017, 15:17:55)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[1,2],[3,4]])
>>> c = a * b
>>> c
array([[ 1,  4],
       [ 9, 16]])
>>> d = np.dot(a, b)
>>> d
array([[ 7, 10],
       [15, 22]])

矩阵相乘:

例子:

 

uTorrent Disk Overloaded解决方法

由于填零机制,uTorrent在大量下载的情况下,很容易就会发生磁盘过载(Disk Overloaded)的问题,要解决这个问题,需要从以下几个方面配置。

1、替换uTorrent版本。最新版本的uTorrent客户端容易出现内存泄漏、磁盘缓存溢出等问题,建议替换到2.0.4或者2.2.1版本。我用的是2.0.4的古老版本,功能简单够用也十分稳定。老版本的uTorrent可以在OldVersion.com这个网站上下载。

2、减少同时下载数。由于填零机制,过多的下载数会瞬间占满缓存,所以建议减小这个数值。我设置成了10

3、修改缓存设置。这是最重要的一步,通过修改磁盘缓存配置,能够直接的解决过载问题。建议设置如下。

4、修改磁盘I/O配置。这也是重要的步骤,通过直接修改磁盘I/O机制,减小负载。核心就是将diskio.no_zero和diskio.sparse_files设置为true

TensorFlow学习笔记01

在虚拟环境virtualenv中安装TensorFlow

yum install python34
yum install python34-pip
pip3 install virtualenv
yum install python-devel
mkdir tensorflow
cd tensorflow/
virtualenv venv -p /usr/bin/python3 --no-site-packages # 使用virtualenv虚拟环境安装
cd venv/
. bin/activate
pip install -U TensorFlow

Hello Demo

python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))

准备MNIST数据集

vim input_data.py

内容如下

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

执行后,会自动下载MNIST数据集到MNIST_data这个目录。(需要翻墙)

(venv) [root@localhost MNIST_data]# ll
total 11340
drwxr-xr-x. 2 root root    4096 Nov  8 15:47 .
drwxr-xr-x. 3 root root      43 Nov  8 15:56 ..
-rw-r--r--. 1 root root 1648877 Nov  8 15:47 t10k-images-idx3-ubyte.gz
-rw-r--r--. 1 root root    4542 Nov  8 15:47 t10k-labels-idx1-ubyte.gz
-rw-r--r--. 1 root root 9912422 Nov  8 15:47 train-images-idx3-ubyte.gz
-rw-r--r--. 1 root root   28881 Nov  8 15:47 train-labels-idx1-ubyte.gz

CentOS使用shadowsocks代理

本文主要用于国内服务器访问被GFW屏蔽的外网时的代理设置。由于shadowsocks本身为socket5服务器,所以还需要借助代理工具将流量进行转发,本文中使用的为广泛应用的Privoxy。

ShadowSocks安装配置

首先安装shadowsocks服务器并配置。

yum install epel-release python-pip m2crypto
pip install shadowsocks

创建shadowsocks客户端配置文件

vim /etc/ss_client.json

配置如下

{
    "server":"ss_server_ip",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"your_password",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false
}

启动shadowsocks服务器

sslocal -c /etc/ss_client.json -d start

Privoxy代理安装配置

之后需要使用Privoxy将流量转发,首先安装Privoxy

yum -y install privoxy

添加privoxy配置

echo 'listen-address localhost:8118' >> /etc/privoxy/config  # 8118为Privoxy默认端口
echo 'forward-socks5 / 127.0.0.1:1080 .' >> /etc/privoxy/config # 全局代理,所有流量都转发到socket5

启动privoxy服务器

systemctl start privoxy

最后,配置环境变量http_proxy/https_proxy

vim /etc/profile

在最后添加

export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
export no_proxy=localhost

使配置生效

source /etc/profile

测试结果

此时,所有的配置已经完成。下面使用curl访问google.com,如果能够获取到内容即成功

curl www.google.com

参考