第七章 多层神经网络—解决非线性问题(深度学习之TensorFlow入门、原理与进阶实战)

实例28:用线性单分逻辑回归分析肿瘤是良性还是恶性的:

from sklearn.utils import shuffle###
def generate(sample_size, mean, cov, diff, regression):
    num_classes = 2 
    samples_per_class = int(sample_size/2)
    
    X0 = np.random.multivariate_normal(mean, cov, samples_per_class)#方法用于根据实际情况生成一个多元正态分布矩阵,mean = 1
    Y0 = np.zeros(samples_per_class)
    
    for ci, d in enumerate(diff):
        X1 = np.random.multivariate_normal(mean+d, cov, samples_per_class)
        Y1 = (ci+1)*np.ones(samples_per_class)
        
        X0 = np.concatenate((X0,X1))#numpy提供了numpy.concatenate((a1,a2,...), axis=0)函数。能够一次完成多个数组的拼接。其中a1,a2,...是数组类型的参数
        Y0 = np.concatenate((Y0,Y1))#适合大量数据
          
    if regression == False:
        class_ind = [Y == class_number for class_number in range(num_classes)]
        Y = np.asarry(np.hstack(class_ind), dtype=np.float32)
        #array和asarray都可将结构数据转换为ndarray类型。但是主要区别就是当数据源是ndarray时,array仍会copy出一个副本,占用新的内存,但asarray不会。
    

    #X=random.shuffle(X0)
    #Y=random.shuffle(Y0)#shuffle() 方法将序列的所有元素随机排序   import random  random.shuffle (lst )
    X, Y = shuffle(X0, Y0)

    return X,Y
        
    
    
import numpy as np
import matplotlib.pyplot as plt
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
np.random.seed(10)
num_classes = 2
mean = np.random.randn(num_classes)
cov = np.eye(num_classes)
X, Y = generate(1000, mean, cov, [3.0], True)
colors = ['r' if l == 0 else 'b' for l in Y[:]]
plt.scatter(X[:,0], X[:,1], c=colors)
plt.xlabel("Scaled age (in yrs)")
plt.ylabel("Tumor size (in cm)")
plt.show()
lab_dim = 1
#构建网络结构
input_dim = 2
input_features = tf.placeholder(tf.float32, [None, input_dim])
input_lables = tf.placeholder(tf.float32, [None, lab_dim])
#定义学习参数
W = tf.Variable(tf.random_normal([input_dim,lab_dim]), name = 'weight')
b = tf.Variable(tf.zeros([lab_dim]), name = 'bias')

output = tf.nn.sigmoid(tf.matmul(input_features, W) + b)
cross_entropy = -(input_lables * tf.log(output) + (1- input_lables) * tf.log(1 - output))
ser = tf.square(input_lables - output)
loss = tf.reduce_mean(cross_entropy)
err = tf.reduce_mean(ser)
optimizer = tf.train.AdamOptimizer(0.04)
train = optimizer.minimize(loss)
#训练
maxEpochs = 50
minibatchsize = 25
#启动session
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    #向模型输入数据
    for epoch in range(maxEpochs):
        sumerr = 0
        for i in range(np.int32(len(Y)/minibatchsize)):
            x1 = X[i * minibatchsize: (i+1)*minibatchsize,:]
            y1 = np.reshape(Y[i * minibatchsize:(i+1)*minibatchsize], [-1,1])
            tf.reshape(y1,[-1,1])
            _,lossval,outputval,errval = sess.run([train, loss, output,err], feed_dict = {input_features: x1, input_lables: y1})
            sumerr = sumerr + errval
            
        print("Epoch:",'%04d'%(epoch+1), "cost =","{:.9f}".format(lossval),"err =",sumerr/minibatchsize)
        
        
    #数据可视化
    train_X, train_Y = generate(100, mean, cov, [3.0], True)
    colors = ['r'if l == 0 else 'b' for l in train_Y[:]]
    plt.scatter(train_X[:,0], train_X[:,1], c = colors)
    x = np.linspace(-1,8,200)
    y = -x*(sess.run(W)[0]/sess.run(W)[1])-sess.run(b)/sess.run(W)[1]
    plt.plot(x,y, label = 'Fitted line')
    plt.legend()
    plt.show()

运行结果:

实例29:用线性逻辑回归处理多线性分类问题


# -*- coding: utf-8 -*-

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

import numpy as np

import matplotlib.pyplot as plt

 

from sklearn.utils import shuffle

from matplotlib.colors import colorConverter, ListedColormap 

    

# 对于上面的fit可以这么扩展变成动态的

from sklearn.preprocessing import OneHotEncoder

def onehot(y,start,end):

    ohe = OneHotEncoder()

    a = np.linspace(start,end-1,end-start)

    b =np.reshape(a,[-1,1]).astype(np.int32)

    ohe.fit(b)

    c=ohe.transform(y).toarray()  

    return c     

#

    

def generate(sample_size, num_classes, diff,regression=False):

    np.random.seed(10)

    mean = np.random.randn(2)

    cov = np.eye(2)  

    

    #len(diff)

    samples_per_class = int(sample_size/num_classes)

 

    X0 = np.random.multivariate_normal(mean, cov, samples_per_class)

    Y0 = np.zeros(samples_per_class)

    

    for ci, d in enumerate(diff):

        X1 = np.random.multivariate_normal(mean+d, cov, samples_per_class)

        Y1 = (ci+1)*np.ones(samples_per_class)

    

        X0 = np.concatenate((X0,X1))

        Y0 = np.concatenate((Y0,Y1))

        #print(X0, Y0)

    

  

    if regression==False: #one-hot  0 into the vector "1 0

        Y0 = np.reshape(Y0,[-1,1])        

        #print(Y0.astype(np.int32))

        Y0 = onehot(Y0.astype(np.int32),0,num_classes)

        #print(Y0)

    X, Y = shuffle(X0, Y0)

    #print(X, Y)

    return X,Y    

 

 

# Ensure we always get the same amount of randomness

np.random.seed(10)

 

input_dim = 2

num_classes =3 

X, Y = generate(2000,num_classes,  [[3.0],[3.0,0]],False)

aa = [np.argmax(l) for l in Y]

colors =['r' if l == 0 else 'b' if l==1 else 'y' for l in aa[:]]

 

plt.scatter(X[:,0], X[:,1], c=colors)

plt.xlabel("Scaled age (in yrs)")

plt.ylabel("Tumor size (in cm)")

plt.show()

 

#参考了https://blog.csdn.net/weixin_37993251/article/details/89601178该文

运行截图:

#构建网络结构
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
lab_dim = num_classes
#定义占位符
input_features = tf.placeholder(tf.float32, [None, input_dim])
input_labels = tf.placeholder(tf.float32, [None, lab_dim])
#定义学习参数
W = tf.Variable(tf.random_normal([input_dim, lab_dim]),name = 'weight')
b = tf.Variable(tf.zeros([lab_dim]),name = 'bias')
output = tf.matmul(input_features, W)+ b
z = tf.nn.softmax(output)

a1 = tf.argmax(tf.nn.softmax(output), axis = 1)#按行找出索引值,生成数组
b1 = tf.argmax(input_labels, axis = 1)
err = tf.count_nonzero(a1-b1)#两个数组相减,不为0就是错误个数
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels= input_labels,logits=output)
loss = tf.reduce_mean(cross_entropy)
optimizer = tf.train.AdamOptimizer(0.04)
train = optimizer.minimize(loss)

 

#训练
maxEpochs = 50
minibatchsize = 25
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    
    for epoch in range(maxEpochs):
        sumerr = 0
        for i in range(np.int32(len(Y)/minibatchsize)):
            x1 = X[i * minibatchsize:(i+1)*minibatchsize,:]
            y1 = Y[i * minibatchsize:(i+1)*minibatchsize,:]
            
            _,lossval, outputval,errval = sess.run([train,loss,output,err], feed_dict = {input_features: x1, input_labels:y1})
            sumerr= sumerr + (errval/minibatchsize)
        print("Epochs:", '%04d'%(epoch+1),"cost=","{:.9f}".format(lossval),"err=",sumerr/minibatchsize)
    
#数据可视化
    train_X,train_Y = generate(200,num_classes, [[3.0],[3.0,0]],False)
    aa = [np.argmax(1) for l in train_Y]
    colors = ['r'if l ==0 else 'b' if l==1 else 'y' for l in aa[:1]]
    plt.scatter(train_X[:,0], train_X[:,1], c=colors)

    x=np.linspace(-1,8,200)
    y=-x*(sess.run(W)[0][0]/sess.run(W)[1][0])-sess.run(b)[0]/sess.run(W)[1][0]
    plt.plot(x,y, label='first line', lw=3)
    
    y=-x*(sess.run(W)[0][1]/sess.run(W)[1][1])-sess.run(b)[1]/sess.run(W)[1][1]
    plt.plot(x,y, label='second line',lw=2)
    
    y=-x*(sess.run(W)[0][2]/sess.run(W)[1][2])-sess.run(b)[2]/sess.run(W)[1][2]
    plt.plot(x,y, label='third line', lw=1)

    plt.legend()
    plt.show()
    print(sess.run(W), sess.run(b))
    
    
    #模型可视化
    train_X,train_Y = generate(200, num_classes, [[3.0], [3.0, 0]], False)
    aa = [np.argmax(1) for l in train_Y]
    colors = ['r' if l==0 else 'b' if l==1 else 'y' for l in aa[:]]
    plt.scatter(train_X[:,0], train_X[:,1], c=colors)
    
    nb_of_xs = 200
    xs1 = np.linspace(-1, 8, num=nb_of_xs)
    xs2 = np.linspace(-1, 8, num=nb_of_xs)
    xx,yy = np.meshgrid(xs1, xs2)
    #初始化和填充classification plane
    classification_plane = np.zeros((nb_of_xs, nb_of_xs))
    for i in range(nb_of_xs):
        for j in range(nb_of_xs):
            classification_plane[i, j] = sess.run(a1, feed_dict= {input_features: [[xx[i,j], yy[i,j] ]]})
     #创建color map显示
    cmap = ListedColormap([
        colorConverter.to_rgba('r', alpha=0.30),
        colorConverter.to_rgba('b', alpha=0.30),
        colorConverter.to_rgba('y', alpha=0.30)])
    #图示各个样本边界
    plt.contourf(xx,yy,classification_plane, cmap=cmap)
    plt.show()

 

运行截图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
深度学习是一种机器学习的方法,通过多层神经网络来学习数据的特征表示。神经网络是由许多神经元(或节点)组成的网络,每个神经元可以通过权重和激活函数来对输入行加权和非线性变换。 在深度学习中,数据通常表示为张量(tensor),它是一个多维数组。张量由一个或多个轴组成,每个轴表示数据的一个维度。常见的张量有标量(0维)、向量(1维)、矩阵(2维)等。 了解张量和神经网络后,我们可以开始实现深度学习模型。其中一个常用的深度学习框架是TensorFlowTensorFlow是一个开源的Python库,可以用于构建和训练神经网络模型。 在TensorFlow中,我们可以通过定义网络的架构,包括层和节点的连接方式来构建神经网络模型。可以使用各种各样的层,如全连接层、卷积层和池化层等来构建模型。在每个层中,可以使用不同的激活函数来引入非线性。 一旦模型被构建,我们需要行训练。在训练过程中,我们将数据输入模型中,并根据定义的损失函数来计算模型的预测误差。通过反向传播算法,我们可以根据这些误差来调整网络中的权重和偏差,以使模型的性能不断改TensorFlow还提供了一些优化器,如随机梯度下降(SGD)等,用于自动计算和调整权重和偏差。此外,TensorFlow还支持分布式计算和GPU加速,可以加快计算速度。 通过图解深度学习与神经网络,我们可以更好地理解深度学习的原理和实现。通过学习如何使用TensorFlow构建和训练神经网络模型,我们可以更好地应用深度学习来解决各种各样的问题,如图像分类、语音识别和自然语言处理等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pp也耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值