week37 配置服务器 tensorflow入门
晚风 只需敲响 敲响晚钟 似乎有人 开始被感动
安静在山顶看飞鸟匆匆 原来沉默才震耳欲聋
配置阿里云服务器+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()
效果