美文网首页learning
week37 配置服务器 tensorflow入门

week37 配置服务器 tensorflow入门

作者: 吃醋不吃辣的雷儿 | 来源:发表于2020-07-03 10:38 被阅读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()
    
    效果

    相关文章

      网友评论

        本文标题:week37 配置服务器 tensorflow入门

        本文链接:https://www.haomeiwen.com/subject/tnylxktx.html