0=w1x1 + w2x2 + b 可以模拟空间中任意一条直线,然后用这条直线来进行分类
这条直线可以写成0=wX,对于一个任意的x,如果wX 大于 零,则直线是上移的状态,x属于直线上方的一类,如果wX 小于零,则x属于直线下方的一类。
import torch
X = torch.tensor([[1, 0, 0], [1, 1, 0], [1, 0, 1], [1, 1, 1]], dtype=torch.float32)
def logitic(X):
torch.random.manual_seed(220)
dense = torch.nn.Linear(3,1)
zhat = torch.sigmoid(dense(X))
print(zhat)
y = torch.tensor([int(i) for i in zhat >= 0.5],dtype=torch.float32)
return y
def orget(X):
w = torch.tensor([-0.08, 0.15, 0.15], dtype=torch.float32)
zhat = torch.mv(X, w)
or_get = [int(i) for i in zhat >= 0]
return or_get
def nanand(X):
w = torch.tensor([0.23,-0.15,-0.15],dtype=torch.float32)
zhat = torch.mv(X,w)
nan_get = [int(i) for i in zhat >= 0]
return nan_get
def andget(X):
w = torch.tensor([-0.2,0.15,0.15],dtype=torch.float32)
zhat = torch.mv(X,w)
and_get = [int(i) for i in zhat >= 0]
return and_get
def XOR(X):
x0 = torch.tensor([1,1,1,1],dtype=torch.float32)
zhat_or = torch.tensor(orget(X),dtype=torch.float32)
zhat_naand = torch.tensor(nanand(X),dtype=torch.float32)
X_new = torch.cat((x0.view(4,1),zhat_or.view(4,1),zhat_naand.view(4,1)),dim=1)
# print(zhat_naand)
# print(zhat_or)
# print(X_new)
return andget(X_new)
if __name__ == '__main__':
# print(andget(X))
# print(logitic(X))
# print(orget(X))
# print(nanand(X))
print(XOR(X))
除了输出层,没一层每个神经元都带有一个函数(上面的就是先加和,再阶越(激活函数hz,在输出层上是gz ),输入层,有常量称为常量神经元,有特征的称为特征神经元。
对于这些层中,最重要的是层中的激活函数,如果将代码中隐藏层的激活函数去掉,也就是激活函数变成hendengbianhuan,这时直接传入输出层,则输出层激活函数最终得到了一个线性方程,还是无法解决非线性问题。所以,当一个问题当前激活函数解决不了时,可以换其它的激活函数来达到效果。h(z)影响模型效果,g(z)影响输出形式(回归,二分类,多分类。。。)
多层神经网络需要对特征矩阵先转置,w在前进行计算
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)