深度学习的学习记录(三)

目录

感悟/心得/收获

解决tf不出数组问题(tf版本问题)

沐神视频2.3及涉及python的函数

《动手学》上的对于特定轴求和问题,降维求和

豆豆课程5——激活函数

豆豆实验激活函数实验5

对于前几次课的总结

代码疑问,来自于第四节豆豆实验

西瓜书

豆豆课程6  隐藏层

豆豆实验6  隐藏层


感悟/心得/收获

答辩结束了,等着拿毕业证和学位证,对于学习上的一些问题,还是有压力,今天看了一个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()

tf.reduce_sum()_庆志的小徒弟-CSDN博客

是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

范数就是向量或者矩阵的一个长度。

点积                     x^{T}y=\sum _{i=1}^{d}x_{i}y_{i}

豆豆课程5——激活函数

简单的贴标签比仔细的计算更符合我们生物的本能,比如在描述馒头的大小时候,我们首先想到的是,大馒头能吃饱,小馒头吃不饱,而不是去在脑中进行绘画一个馒头大小和饱腹程度的关系图。也就是说,人类思考问题的方式往往都是离散的分类而不是精确的拟合。

所以我们也想让海底生物小蓝进行这种直观的分类,比如说小蓝能抗住0.8的毒,那么豆豆的毒性大于0.8对小蓝来说就是有毒,小于0.8就是对小蓝没毒。所以这时我们要用到分段函数。此时y轴不再是豆豆毒性的大小,而是毒性的概率。这种分段函数\varphi (y)=\left\{ \begin{aligned} & \1,y\geq 0.8\\ & \0 ,y <0.8\\ \end{aligned} \right.,其实就是激活函数。

所以我们采用更好看的S型函数,Logistic函数    \varphi(y)=\frac{L}{1+e^{-k(y-y_0)}},一般我们采用标准的Logistic函数,取L=1,k=1,y_0=0,即  \varphi (y)=\frac{1}{1+e^{-y}}

如果用类似阶跃函数,,虽然判断的自信满满,但是在分界点处的导数不好处理而除了分界点其他地方的导数总是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=(y-wx)^2是一个复合函数,求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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值