目录
感悟/心得/收获
答辩结束了,等着拿毕业证和学位证,对于学习上的一些问题,还是有压力,今天看了一个NFL 定理简单证明,感觉概率论的知识有好多遗忘,而自己的深度学习的进度进行的也不是很快。有些苦恼。
emmmmm,前几次的学习没有看李沐的视频,一直是看《动手学》的书,今天好好的看了看直播回放,突然发现是我鲁莽了,应该得看着直播回放学,真的好。
看csdn高校人工智能直播中了一个加湿器,印了一个oneflow的logo,蛮好看的。看华为云直播中了一个华为云的镭射pvc包。
刚开始学的是mxnet,不是tensorflow,所以现在把tensorflow看一下
解决tf不出数组问题(tf版本问题)
沐神的代码我运行了不出数组。不知为何,出数组的话需要session运行一下。但是《动手学》里面并不需要session。
import tensorflow as tf
x=tf.constant([[1,2,3],[3,4,5],[5,6,7]])
x
并不出数组,只有这样才出
import tensorflow as tf
x=tf.constant([[1,2,3],[3,4,5],[5,6,7]])
x
sess=tf.Session()
sess.run(tf.global_variables_initializer()) #不加这句代码也一样出数组,不加可能报错,报错的时
#可以加上试试。
print(sess.run(x))
动手学上的代码运行结果是出数组的,但是我的总是不出,百度解决办法,百度不出来,寻思用pycharm装一个tensorflow,但是网太卡,不忍心花流量,继续百度,然后找到了这个。
TensorFlow入门:第一个机器学习Demo_戈云飞的博客-CSDN博客
正如我上面的代码所展示的。这是对tf1.x版本而言!!!
在百度之前,在群里问了一下,别人的是不是也不出数组,然后有个老哥刚回我说是不是tensorflow的版本不对,说我的是不是tf1.x,然后我进入环境,pip list看了一下,果然是
沐神视频2.3及涉及python的函数
os 模块提供了非常丰富的方法用来处理文件和目录。
os例子
import os
Path1 = 'home'
Path2 = 'develop'
Path3 = 'code'
Path10 = Path1 + Path2 + Path3
Path20 = os.path.join(Path1,Path2,Path3)
print ('Path10 = ',Path10)
print ('Path20 = ',Path20)
沐神数据预处理
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n') # 列名
f.write('NA,Pave,127500\n') # 每行表示一个数据样本
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
# 如果没有安装pandas,只需取消对以下行的注释:
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
疑问:不是很明白,把os.makedirs(os.path.join('..', 'data'), exist_ok=True)删掉,把data_file里的前两个也删掉,也没啥影响,不懂那为啥加上呢?感觉本着如无必要,勿增新知,没必要加吧。
最后不print的话会以html方式print,感觉会更好看一些。
沐神说csv文件,每一行是一个数据。一般读取csv文件要用到pandas库。NaN是缺失值,但是对于有缺失值的数据,丢掉比较可惜,所以一般选择插值。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] #将前三列拿出来放到inputs,最后一列放
inputs = inputs.fillna(inputs.mean()) #outputs
print(inputs)
#mean()是求均值的
参考
pandas的get_dummies_昆兰.沃斯 的博客-CSDN博客
刚才继续开始补tf,《动手学》
emmmmm,已经开始混了,真实。标量就是一个值,向量就是一行值。把pytorch和tensorflow混了...
tf里的是reshape是先reshape再range,而pytorch是arange.reshape
tf.reduce_sum()
是tensorflow里求和的
函数:tf.reduce_sum(input_tensor,axis=None,keep_dims=False,name=None)
《动手学》上的对于特定轴求和问题,降维求和
第10个模块里axis=0,就相当于下下面的图里所说。
axis=1,就是第一列相加,第二列相加依次...
对于这里的按照指定维度求和,有点不懂,百度理解了一下。以下是搬运的一位博主的博客,链接如下:numpy按特定轴求和_Chernyang的博客-CSDN博客
可以理解成可以理解为对哪一位求和就是去掉哪一维
现在理解了,就拿上图这个来说,矩阵shape【5,4】就相当于一个五行四列的矩阵,是二维的,所以axis可以等于的数只有0和1.axis等于0时,就是对第一行求和,对第二行求和,一直到第5行;axis等于1时,就是对第一列求和,对第二列求和,一直到第四列求和。
对于降维求和而言,对axis=0求和就相当于丢掉了那一个的维度,2维会变成1维。
突然发现沐神专门录了一小节视频讲这个东西,真好。
非降维求和
只需让keepdims=True即可。对于应用广播机制的话,需要维度都相等,所以要用到keedims=True
sum_A = tf.reduce_sum(A, axis=1, keepdims=True)
sum_A
范数就是向量或者矩阵的一个长度。
点积
豆豆课程5——激活函数
简单的贴标签比仔细的计算更符合我们生物的本能,比如在描述馒头的大小时候,我们首先想到的是,大馒头能吃饱,小馒头吃不饱,而不是去在脑中进行绘画一个馒头大小和饱腹程度的关系图。也就是说,人类思考问题的方式往往都是离散的分类而不是精确的拟合。
所以我们也想让海底生物小蓝进行这种直观的分类,比如说小蓝能抗住0.8的毒,那么豆豆的毒性大于0.8对小蓝来说就是有毒,小于0.8就是对小蓝没毒。所以这时我们要用到分段函数。此时y轴不再是豆豆毒性的大小,而是毒性的概率。这种分段函数,其实就是激活函数。
所以我们采用更好看的S型函数,Logistic函数 ,一般我们采用标准的Logistic函数,取L=1,k=1,=0,即
如果用类似阶跃函数,,虽然判断的自信满满,但是在分界点处的导数不好处理而除了分界点其他地方的导数总是0无法进行下降。实际上阶跃函数的导数是一个冲击函数,在分界处无穷大,而在其他地方都是0.这很不利于梯度下降。所以使用sigmoid这种软软的润润的,处处可导,导数又处处不为0的激活函数是很好的。我们来看一下,把小蓝的神经元作为激活函数之后小蓝现在的想法.
z=wx+b是神经元预测的第一部分线性函数,当然线性函数的输出并不是最终的一侧结果,所以我们用z表示线性函数的输出,再把线性函数的结果z作为自变量送入到激活函数中。得到a,a才是最后的预测结果,所以输入x和最终预测输出的a的函数关系是这样的
z和x的关系是一个标准的一元一次函数,z=wx+b.
我们把z作为sigmoid的自变量,输出a,a和z形成一个s型曲线,这时候我们改变w和b,a和z的曲线会发生改变吗?答案是不会发生改变,因为a只和z有关系,我不在意w和b是怎样变化的。
那a和x形成的曲线伴随着w和b取值不同的时候,会发生变化。
a的值是根据z确定,而z的值又根据线性函数计算得来的,但是a才不管你的z是怎么来的。
s
只要你的z是0,那么我的a就是0.5,只要你的z是0.2,那么我的a就是0.54.不会因为你的z是不同w和b的取值下算出来的,我就改变a的值。
当然最简单粗暴的方法还是取一个点,用定义法进行求导。
是一个复合函数,求e对w的导数
然后用梯度下降去调整w。
对于多层的神经网络,弱国每个神经元都是一个线性函数,那么即使我们有很多的神经元构建出一个复杂的神经网络,他们仍然是一个线性系统,因为线性函数怎么叠加都是一个线性函数,而激活函数是一个非线性的。他让我们的神经网络摆脱线性的约束,开始具备处理越来越复杂问题的能力。
豆豆实验激活函数实验5
dataset5.py
import numpy as np
def get_beans(counts):
xs = np.random.rand(counts)
xs = np.sort(xs)
ys = np.zeros(counts)
for i in range(counts):
x = xs[i]
yi = 0.7*x+(0.5-np.random.rand())/50+0.5
if yi > 0.8:
ys[i] = 1
return xs,ys
import dataset5
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
xs,ys=dataset5.get_beans(100)
plt.title("Sixe-Toxicity Function",fontsize=15)
plt.xlabel("豆豆大小")
plt.ylabel("有毒概率")
plt.rcParams["font.sans-serif"] = "SimHei"
plt.xlim(0,1)
plt.ylim(0,1.5)
plt.scatter(xs,ys)
w=0.1
b=0.1
z=w*xs+b
a=1/(1+np.exp(-z))
plt.plot(xs,a)
plt.show()
for _ in range(500):
for i in range(100):
x = xs[i]
y = ys[i]
#对w和b求偏导
z=w*x+b
a = 1 / (1 + np.exp(-z))
e=(y-a)**2
deda=-2*(y-a)
dadz=a*(1-a)
dzdw=x
dedw=deda*dadz*dzdw
dzdb=1
dedb=deda*dadz*dzdb
a=0.05
w=w-a*dedw
b=b-a*dedb
plt.clf()
plt.scatter(xs, ys)
z = w * xs + b
a = 1 / (1 + np.exp(-z))
plt.xlim(0, 1)
plt.ylim(0, 1.2)
plt.plot(xs, a)
plt.pause(0.01)
对于前几次课的总结
代码疑问,来自于第四节豆豆实验
emmmm,有时候听过就过去了,自己再看一遍时候又能发现新问题....
西瓜书
今天开始看了西瓜书,然后开始记专业名词,看到NFL定理然后卡壳了。然后百度看别人的理解。稍微能理解部分。不过按书上说,不理解证明过程其实也没有关系,只需记住结论。开学以后开始打算补习概率。
西瓜书看到了第10页。西瓜书不进行系统的学习,打算抽空就看。
豆豆课程6 隐藏层
海底经过巨变,豆豆的毒性不是简单的豆豆越大毒性越大;也不是豆豆越小,毒性越大;而是在某些大小范围内有毒,有些大小范围内没毒。
不论是加了激活函数的模型,还是不加,都不能达到完全的拟合。因为都只是部分的单调。
想要达到很好的拟合,需要 一些不那么单调的函数。
我们要做的事情就是多添加两个神经元。
并把输入分别送入到这两个神经元进行计算,在把计算的结果送到第三个神经元,最后输出,
中间的是隐藏层,
豆豆实验6 隐藏层
w11_2 表示第二层的第一个神经元在第一个输入上的权重。
这次有三个神经元,然后就变得繁琐复杂起来了。编码已复现,今天再看一遍加深理解。
此豆豆数据名为dataset6
import numpy as np
def get_beans(counts):
xs = np.random.rand(counts)*2
xs = np.sort(xs)
ys = np.zeros(counts)
for i in range(counts):
x = xs[i]
yi = 0.7*x+(0.5-np.random.rand())/50+0.5
if yi > 0.8 and yi < 1.4:
ys[i] = 1
return xs,ys
import dataset6
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
xs,ys=dataset6.get_beans(100)
plt.title("Sixe-Toxicity Function",fontsize=15)
plt.xlabel("豆豆大小")
plt.ylabel("有毒概率")
plt.rcParams["font.sans-serif"] = "SimHei"
# plt.xlim(0,1)
# plt.ylim(0,1.5)
plt.scatter(xs,ys)
def sigmoid(x):
return 1/(1+np.exp(-x))
#第一层
#第一个神经元
w11_1=np.random.rand() #第一个第一层的第一个神经元在第一个输入的权重
b1_1=np.random.rand()
w12_1=np.random.rand()
b2_1=np.random.rand()
#第二层
w11_2=np.random.rand()
w21_2=np.random.rand()
b1_2=np.random.rand()
#前向传播
def forward_propgation(xs):
z1_1=w11_1*xs+b1_1
a1_1=sigmoid(z1_1)
z2_1=w12_1*xs+b2_1
a2_1=sigmoid(z2_1)
z1_2=w11_2*a1_1+w21_2*a2_1+b1_2
a1_2=sigmoid(z1_2)
return a1_2,z1_2,a2_1,z2_1,a1_1,z1_1
a1_2,z1_2,a2_1,z2_1,a1_1,z1_1=forward_propgation(xs)
plt.plot(xs,a1_2)
plt.show()
for _ in range(5000):
for i in range(100):
x = xs[i]
y = ys[i]
#先来一次前向传播
a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(x)
# 反向传播
# 误差代价e
e=(y-a1_2)**2
deda1_2=-2*(y-a1_2)
da1_2dz1_2=a1_2*(1-a1_2)
dz1_2dw11_2=a1_1
dz1_2dw21_2=a2_1
dedw11_2=deda1_2*da1_2dz1_2*dz1_2dw11_2
dedw21_2=deda1_2*da1_2dz1_2*dz1_2dw21_2
dz1_2db1_2=1
dedb1_2=deda1_2*da1_2dz1_2*dz1_2db1_2
dz1_2da1_1=w11_2
da1_1dz1_1=a1_1*(1-a1_1)
dz1_1dw11_1=x
dedw11_1=deda1_2*da1_2dz1_2*dz1_2da1_1*da1_1dz1_1*dz1_1dw11_1
dz1_1db1_1=1
dedb1_1=deda1_2*da1_2dz1_2*dz1_2da1_1*da1_1dz1_1*dz1_1db1_1
dz1_2da2_1=w21_2
da2_1dz2_1=a2_1*(1-a2_1)
dz2_1dw12_1 = x
dedw12_1 = deda1_2 * da1_2dz1_2 * dz1_2da2_1 * da2_1dz2_1 * dz2_1dw12_1
dz2_1db2_1 = 1
dedb2_1 = deda1_2 * da1_2dz1_2 * dz1_2da2_1 * da2_1dz2_1 * dz2_1db2_1
a=0.03
w11_2=w11_2-a*dedw11_2
w21_2=w21_2-a*dedw21_2
b1_2=b1_2-a*dedb1_2
w12_1=w12_1-a*dedw12_1
b2_1=b2_1-a*dedb2_1
w11_1=w11_1-a*dedw11_1
b1_1=b1_1-a*dedb1_1
if _%100==0:
plt.clf()
plt.scatter(xs, ys)
a1_2, z1_2, a2_1, z2_1, a1_1, z1_1 = forward_propgation(xs)
plt.plot(xs, a1_2)
plt.pause(0.01)