learning

week37 配置服务器 tensorflow入门

2020-07-03  本文已影响0人  吃醋不吃辣的雷儿
晚风 只需敲响 敲响晚钟 似乎有人 开始被感动
安静在山顶看飞鸟匆匆  原来沉默才震耳欲聋

配置阿里云服务器+vnc4server+xfce4

配置阿里云服务器的系统为Ubuntu16.04,安装ubuntu-desktop桌面
采用vnc4server+xfce4的图形界面,使用VNC Viewer远程登录

sudo apt-get install ubuntu-desktop #安装ubuntu-desktop桌面
sudo apt-get install vnc4server #安装vnc4server
vnc4passwd #配置vnc登录密码
sudo apt-get install xfce4 #安装xfce4

修改~/.vnc/xstartup,改为内容如下:

#!/bin/sh
 
 
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
 
 
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
session-manager & 
xfdesktop & 
xfce4-panel &
xfce4-menu-plugin &
xfsettingsd &
xfconfd &
xfwm4 &

修改完成,启动vncserver

vncserver -geometry 1920x1080 :1

以上皆参考自:
Windows通过vnc4server+xfce4远程连接Ubuntu桌面_shidahu的专栏-CSDN博客_vnc4server xfce4 https://blog.csdn.net/shidahu/article/details/78847088
Ubuntu16.04 配置vnc4server - 浩克匠心 - 博客园 https://www.cnblogs.com/sopic/p/11266773.html

但是遇到了一个坑是配置好后VNC Viewer怎么也连接不上,一直在加载中
盲猜是防火墙的问题,查看/usr/bin/vnc4server里的vncport发现端口是5900+num,于是猜测要开一个5901的端口,果然,在阿里云服务器的防火墙界面添加了一个自定义的5901端口后,访问成功了!

安装python3.7.5,使用pip3.7安装AkShare

wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz #下载
tar -zxvf Python-3.7.5.tgz  #解压
mkdir /usr/local/python3  #创建文件夹
cd Downloads/Python-3.7.5 #进入解压出来的文件夹
./configure --prefix=/usr/local/python3 #配置,准备编译
sudo apt-get update #下一步是安装依赖项,推荐直接这样安装全家桶,先更新源
sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-dev libffi-dev libc6-dev
make #安装完依赖项,编译
make install #安装
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3 #配置python3软链接
ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3.7 #配置pip3软链接

到这一步,使用python3测试,查看python版本,若是3.7.5就没有问题了,完全参考自:
安装python3.7.5_码农也有梦想-CSDN博客_python3.7.5 https://blog.csdn.net/qq_32257215/article/details/104069808
ubuntu下编译安装Python3.7.2 - 进击的星星 - 博客园 https://www.cnblogs.com/wangyuxing/p/10542330.html

pip3.7 install akshare --upgrade
sudo apt-get install nodejs

此时akshare安装完成了,进入python3查看import akshare有没有报错,若无报错则安装成功
其实现在来看思路挺清晰的,先配置系统,把图形化界面配好了以后安python3.7,自带pip3.7,安装akshare,而import导入akshare的时候需要很多依赖项,会报很多类似于Nomodulenamedxxxx之类的错,刚开始我想一个一个安装就好了。我后来才发现,直接安装好全部的依赖项再编译链接多方便啊,所以凡事不要图快,要静下心来慢慢做。

①zipimport.ZipImportError:can't decompress data;zlibnot available

sudo apt-get install zlib1g-dev
cd Python-3.7.5
make
make install

②no module named '_bz2'

sudo apt-get install libbz2-dev
cd Python-3.7.5
make
make install

③Can't connect to HTTPS URL because the SSL module is not available. No module named '_ssl'

sudo apt-get install openssl
cd Python-3.7.5
make
make install

Win10+Anaconda+Python3.7.4安装tensorflow

以下命令均在cmd中进行
#查看Anaconda和Python版本
conda --version
python --version
#创建tensorflow环境
conda create --name tensorflow python=3.7.4
#输入yes
#查看环境
conda info --envs
#激活进入tensorflow环境
activate tensorflow
#安装tensorflow
从官网下载cp37的whl文件 "地址:https://pypi.org/project/tensorflow/2.0.0/#files"
进入对应文件夹
pip install tensorflow-2.0.0-cp37-cp37m-win_amd64.whl
#检验是否安装完好
python
>>> import tensorflow as tf
若无报错 则安装完好
参考 https://blog.csdn.net/xiong_backbone/article/details/104531444

若使用VScode开发,可参考https://blog.csdn.net/qq_41662115/article/details/86420983

④ 为什么要用placeholder?

Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,类似于docker中的镜像。然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。

所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。

tf.placeholder( dtype, shape=None, name=None)
dtype:数据类型。常用的是tf.float32,tf.float64等数值类型
shape:数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)
name:名称

⑤ 数据如何标准化?

(0,1)标准化:
这是最简单也是最容易想到的方法,通过遍历feature vector里的每一个数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理:

def MaxMinNormalization(x,Max,Min):
    x = (x - Min) / (Max - Min)
    return x

Z-score标准化:
这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,这里的关键在于复合标准正态分布:

def Z_ScoreNormalization(x,mu,sigma):
    x = (x - mu) / sigma
    return x
def get_train_data(batch_size=60,time_step=20,train_begin=0,train_end=5800):
    batch_index=[]
    data_train=data[train_begin:train_end]
    #标准化 np.mean(data_train,axis=0) 计算每一列的均值,np.std(data_train,axis=0)每列的标准差
    normalized_train_data=(data_train-np.mean(data_train,axis=0))/np.std(data_train,axis=0)  
    print "normalized_train_data:\n",normalized_train_data
#这里一样,mu(即均值)用np.average(),sigma(即标准差)用np.std()即可。

Sigmoid函数
Sigmoid函数是一个具有S形曲线的函数,是良好的阈值函数,在(0, 0.5)处中心对称,在(0, 0.5)附近有比较大的斜率,而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0:

def sigmoid(X,useStatus):
    if useStatus:
        return 1.0 / (1 + np.exp(-float(X)))
    else:
        return float(X)
#这里useStatus管理是否使用sigmoid的状态,方便调试使用。

⑥ zip函数?
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped)  # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c))              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
 
>>> a1, a2 = zip(*zip(a,b))          # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>

⑦ 在pandas.core.frame.DataFrame中如何将数据子集转换为列表?
用.values()得到一个numpy.arry,再用tolist()得到列表

import pandas as pd
df = pd.DataFrame({'a':[1,3,5,7,4,5,6,4,7,8,9],
                   'b':[3,5,6,2,4,6,7,8,7,8,9]})
>>> df['a'].values.tolist()
[1, 3, 5, 7, 4, 5, 6, 4, 7, 8, 9]
>>> df['a'].tolist()
[1, 3, 5, 7, 4, 5, 6, 4, 7, 8, 9]

全连接拟合sinx,cosx和square函数

代码如下,参考自https://blog.csdn.net/qq_38973721/article/details/106895652

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt


tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)

class Config:
    def __init__(self):
        self.save_path = './model/sin_cos'  # 训练结果保存的路径
        self.lr = 0.001  # 学习步长
        self.epoches = 1000  # 迭代的次数
        self.samples = 200  # 样本的数量
        self.hidden_units = 200  # 隐藏层神经元的数量

class Sample: 
    def __init__(self,samples):
        self.xs = np.random.uniform(-np.pi, np.pi, samples)  # 使用Numpy随机生成点
        self.xs = sorted(self.xs)  # 对生成的点进行排序(否则会乱)
        self.ys = np.sin(self.xs), np.cos(self.xs), np.square(self.xs)  # 定义需要拟合的三个函数 

class Tensors:
    def __init__(self,config):
        self.x = tf.placeholder(tf.float32,[None],'x')  # 定义输入样本点x的值    c
        self.y = tf.placeholder(tf.float32,[3,None],'y')  # 定义输入样本点y的值  c

        x = tf.reshape(self.x,[-1,1])  # 将所输入的标量转换为向量  c
        x = tf.layers.dense(x, config.hidden_units, tf.nn.relu)  # 使用全连接进行函数
        self.y_predict = tf.layers.dense(x,3)  # 全连接获取预测的y值 c
        print(self.y_predict.shape)
        y = tf.transpose(self.y, None)  # 对输入的y值进行转置,方便进行后续操作
        self.loss = tf.reduce_mean(tf.square(self.y_predict - y)) # 获取损失函数的值
        self.lr = tf.placeholder(tf.float32, [], 'lr')  # 定义学习步长
        opt = tf.train.AdamOptimizer(config.lr)  # 梯度下降优化器,进行拟合
        self.train_op = opt.minimize(self.loss)  # 获取dertx的值
        self.loss = tf.sqrt(self.loss) # 对获取的损失值进行开平方操作,使误差减少

class SinApp:
    def __init__(self,config):
        self.config = config
        self.ts = Tensors(config)
        self.session = tf.Session()
        self.saver = tf.train.Saver()
        try:
            self.saver.restore(self.session, config.save_path)
            print(f"restore model from {config.save_path} successfully")
        except:
            print(f"fail to restore the model from {config.save_path}")
            self.session.run(tf.global_variables_initializer())
    def train(self):  # 训练方法
        samples = Sample(self.config.samples)
        cfg = self.config
        ts = self.ts
        for _ in range(cfg.epoches):
            self.session.run(ts.train_op,{ts.x:samples.xs, ts.y : samples.ys, ts.lr:cfg.lr})
        self.save()
        return samples.xs,samples.ys
    def predict(self):  # 预测方法
        samples = Sample(400)
        ys = self.session.run(self.ts.y_predict,{self.ts.x:samples.xs})
        return samples.xs, ys
    def save(self):
        self.saver.save(self.session, self.config.save_path)    
    def close(self):
        self.session.close()

if __name__ == "__main__":
    app = SinApp(Config())
    xs_train, ys_train = app.train()  # train代表正确的、与事实相符的数据点
    xs_predict, ys_presict = app.predict()  # predict x代表生成的横坐标 y代表训练后预测的结果
    ys_train = np.transpose(ys_train)
    plt.plot(xs_train, ys_train)
    plt.plot(xs_predict, ys_presict)
    plt.legend(['sin', 'cos', 'square', 'predict_sin', 'predict_cos', 'predict_square'])
    plt.show()
效果
上一篇下一篇

猜你喜欢

热点阅读