深度学习原理与框架-神经网络-线性回归与神经网络的效果对比 1.np.c_[将数据进行合并] 2.np.linspace(将数据拆成n等分) 3.np.meshgrid(将一维数据表示为二维的维度) 4.plt.contourf(画出等高线图,画算法边界)
1. np.c[a, b] 将列表或者数据进行合并,我们也可以使用np.concatenate
参数说明:a和b表示输入的列表数据
2.np.linspace(0, 1, N) # 将0和1之间的数分成N份
参数说明:0表示起始数据,1表示末尾数据,N表示生成的分数
3.xx, yy = np.meshgrid(np.arange(x.min(), x.max(), N), np.arange(y.min(), y.max(), N)) 对数据进行切分后,生成二维数据点
参数说明:np.arange(x.min(), x.max(), N) X轴的一维数据,np.arange(y.min(), y.max(), N) y轴一维数据,
4. plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral) 用于生成等高线图
参数说明:xx和yy表示x轴方向的二维数据,yy表示y轴的二维方向的数据,Z表示颜色对应的标签值, cmap表示颜色板
线性网络和神经网络的区别:
第一:线性网络只有一个w*x + b ,即线性变化层, 神经网络可以有多个w*x + b , 且中间存在一个激活层relu
线性回归代码解说:
第一步:使用np.c_[r*sin(t), r*cos(t)] 构造出二维的数据
第二步:前向传播
第一步:前向传播np.dot(x, w) + b 计算得分scores
第二步:使用e^scores / ∑e^scores 计算出概率值
第三步:使用-np.log(probs[np.arange(num_sample, y)]) 计算交叉熵,并且使用np.sum计算总的交叉熵损失值
第三步:反向传播
第一步:计算softamx反向传播的结果,即dout[np.arange(num_sample), y] -= 1 , dout /= num_samples
第二步:计算dx, dw, db, 这里的话也需要加上正则化惩罚项的求导,即w * reg
第四步:更新参数 w = dw*step_size + w, b = db * step_size + b
第五步:使用np.argmax()计算预测值, 利用pred_labels == y.mean() 计算准确率
第六步:使用plt.contourf 画出等高线图
代码:
import numpy as np
import matplotlib.pyplot as plt np.random.seed(0) # 随机种子
N = 100 # 每类样本的个数
K = 3 # 标签值
D = 2 # 维度
X = np.zeros((N*K, D)) # 样本初始化
y = np.zeros(N*K, dtype='int') # 标签初始化
print(y.shape)
# 第一步:使用np.c_构造数据
for j in range(K):
xi = np.arange(j*N, N*(j+1))
r = np.linspace(0.0, 1, N)
t = np.linspace(j*4, (j+1)*4, N) + np.random.randn(N) * 0.2
X[xi] = np.c_[r*np.sin(t), r*np.cos(t)] # 构造样本
y[xi] = j # 构造标签
# 初始化参数
W = np.random.randn(D, K) * 0.01
b = np.zeros((1, K))
reg = 1e-3
step_size = 1e-1 num_examples = X.shape[0]
for i in range(1000):
# 第二步前向传播
# 前向传播计算得分
scores = np.dot(X, W) + b # 计算概率
softmax_scores = np.exp(scores)
probs = softmax_scores / np.sum(softmax_scores, axis=1, keepdims=True)
# 计算损失值
data_loss = -np.sum(np.log(probs[np.arange(num_examples), y])) / num_examples
reg_loss = 1 / 2 * np.sum(W*W)
loss = data_loss + reg_loss
if i == 100:
print(loss)
# 第三步:计算反向传播
dout = probs
# 求出softmax的反向传播
dout[np.arange(num_examples), y] -= 1
dout /= num_examples
# 求出dW和db
dW = np.dot(X.T, dout)
db = np.sum(dout, axis=0)
# 正则化惩罚项的求导
dW += W * reg
# 第四步:进行参数的更新操作
W = W - step_size * dW
b = b - step_size * db scores = np.dot(X, W) + b # 第五步:使用得分,获得最终的准确率
pred_labels = np.argmax(scores, axis=1)
print('accucacy %.2f'%(np.array([pred_labels==y]).mean())) # 第六步:使用plt.contourf画出等高线图
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h)) Z = np.dot(np.c_[xx.ravel(), yy.ravel()], W) + b
Z = np.argmax(Z, axis=1) Z = Z.reshape(xx.shape) fig = plt.figure()
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.show()
准确率为0.49
神经网络代码解说:
第一步:使用np.c_[r*sin(t), r*cos(t)] 构造出二维的数据
第二步:前向传播
第一步:前向传播np.dot(x, w1) + b1计算第一层
第二步:np.maximum(np.dot(x1, w2) + b2) 加上一个relu激活函数作为第二层
第三步:使用np.exp(scores) / ∑np.exp(scores) 获得概率值
第四步:使用-np.log(probs[np.arange(num_sample, y)]) 计算交叉熵,并且使用np.sum计算总的交叉熵损失值
第三步:反向传播
第一步:计算softamx反向传播的结果,即dout[np.arange(num_sample), y] -= 1 , dout /= num_samples
第二步:计算dh1, dw2, db2, 这里的话也需要加上正则化惩罚项的求导,即w * reg
第三步:计算relu激活层的反向传播,即dout[x<0] = 0
第四步:计算dw1和db1
第五步:在dw1和dw2的基础上,加上正则化惩罚项的求导,reg * W
第四步:更新参数 w = dw*step_size + w, b = db * step_size + b
第五步:使用np.argmax()计算预测值, 利用pred_labels == y.mean() 计算准确率
第六步:使用plt.contourf 画出等高线图
代码:
import numpy as np
import matplotlib.pyplot as plt # 随机种子
np.random.seed(0)
N = 100 # 每个样本的个数
K = 3 # 样本的类别
D = 2 # 表示两个维度 X = np.zeros((N*K, D))
y = np.zeros(N*K, dtype='int')
# 第一步:构造数据
for j in range(K):
ix = np.arange(j*N, (j+1)*N)
r = np.linspace(0.0, 1, N)
t = np.linspace((4*j), (j+1)*4, N) + np.random.randn(N) * 0.2
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
y[ix] = j
# 初始化权重参数
W1 = np.random.rand(D, 100) * 0.01
b1 = np.zeros((1, 100))
W2 = np.random.randn(100, K) * 0.01
b2 = np.zeros((1, K)) reg = 1e-3 # 正则化的概率
step_size = 1 # 学习率
num_samples = X.shape[0] # 样本的个数
for i in range(2000):
# 第二步:循环,进行前向传播
# 第一层得分值的获得
h1 = np.dot(X, W1) + b1
# 使用relu激活层
relu_h1 = np.maximum(0, h1)
# 进行第二层的前向传播
scores = np.dot(relu_h1, W2) + b2 # 计算概率值
probs = np.exp(scores)
probs = probs / np.sum(probs, axis=1, keepdims=True)
# 计算损失值
data_loss = -np.sum(np.log(probs[np.arange(num_samples), y])) / num_samples
# 正则化惩罚项的损失值
reg_loss = 1 / 2 * np.sum(W1*W1)*reg + 1/2 * np.sum(W2*W2)*reg
loss = data_loss + reg_loss # 进行反向传播
# softmax的反向传播结果
dout = probs.copy()
dout[np.arange(num_samples), y] -= 1
dout /= num_samples
# 第二层反向传播的结果
dh1 = np.dot(dout, W2.T)
dw2 = np.dot(relu_h1.T, dout)
db2 = np.sum(dout, axis=0)
# relu层反向传播的结果
drelu = dh1.copy()
drelu[h1 < 0] = 0
# 第一层方向传播的结果
dw1 = np.dot(X.T, drelu)
db1 = np.sum(drelu, axis=0)
# 在获得梯度权重的基础上加上正则化的梯度值
dw2 += reg * W2
dw1 += reg * W1
# 第四步:进行参数的更新
W2 -= dw2 * step_size
b2 -= db2 * step_size
W1 -= dw1 * step_size
b1 -= db1 * step_size if i%100 == 0:
print(loss) # 第五步:根据得分值,计算准确率
predict_labels = np.argmax(scores, axis=1)
print('accuracy:%.2f'%np.array([predict_labels==y]).mean()) # 第六步:进行画图操作
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h)) # 计算出对应的类别值
Z = np.dot(np.maximum(np.dot(np.c_[xx.ravel(), yy.ravel()], W1) + b1, 0), W2) + b2
Z = np.argmax(Z, axis=1) Z = Z.reshape(xx.shape) fig = plt.figure()
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.show()
准确率0.95
深度学习原理与框架-神经网络-线性回归与神经网络的效果对比 1.np.c_[将数据进行合并] 2.np.linspace(将数据拆成n等分) 3.np.meshgrid(将一维数据表示为二维的维度) 4.plt.contourf(画出等高线图,画算法边界)的更多相关文章
- 深度学习原理与框架-神经网络-cifar10分类(代码) 1.np.concatenate(进行数据串接) 2.np.hstack(将数据横着排列) 3.hasattr(判断.py文件的函数是否存在) 4.reshape(维度重构) 5.tanspose(维度位置变化) 6.pickle.load(f文件读入) 7.np.argmax(获得最大值索引) 8.np.maximum(阈值比较)
横1. np.concatenate(list, axis=0) 将数据进行串接,这里主要是可以将列表进行x轴获得y轴的串接 参数说明:list表示需要串接的列表,axis=0,表示从上到下进行串接 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)
1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...
- 深度学习原理与框架-递归神经网络-RNN网络基本框架(代码?) 1.rnn.LSTMCell(生成单层LSTM) 2.rnn.DropoutWrapper(对rnn进行dropout操作) 3.tf.contrib.rnn.MultiRNNCell(堆叠多层LSTM) 4.mlstm_cell.zero_state(state初始化) 5.mlstm_cell(进行LSTM求解)
问题:LSTM的输出值output和state是否是一样的 1. rnn.LSTMCell(num_hidden, reuse=tf.get_variable_scope().reuse) # 构建 ...
- 深度学习原理与框架-卷积神经网络-cifar10分类(图片分类代码) 1.数据读入 2.模型构建 3.模型参数训练
卷积神经网络:下面要说的这个网络,由下面三层所组成 卷积网络:卷积层 + 激活层relu+ 池化层max_pool组成 神经网络:线性变化 + 激活层relu 神经网络: 线性变化(获得得分值) 代码 ...
- 深度学习原理与框架-递归神经网络-时间序列预测(代码) 1.csv.reader(进行csv文件的读取) 2.X.tolist(将数据转换为列表类型)
1. csv.reader(csvfile) # 进行csv文件的读取操作 参数说明:csvfile表示已经有with oepn 打开的文件 2. X.tolist() 将数据转换为列表类型 参数说明 ...
- 深度学习原理与框架-Alexnet(迁移学习代码) 1.sys.argv[1:](控制台输入的参数获取第二个参数开始) 2.tf.split(对数据进行切分操作) 3.tf.concat(对数据进行合并操作) 4.tf.variable_scope(指定w的使用范围) 5.tf.get_variable(构造和获得参数) 6.np.load(加载.npy文件)
1. sys.argv[1:] # 在控制台进行参数的输入时,只使用第二个参数以后的数据 参数说明:控制台的输入:python test.py what, 使用sys.argv[1:],那么将获得w ...
- 深度学习原理与框架-Tensorflow基本操作-变量常用操作 1.tf.random_normal(生成正态分布随机数) 2.tf.random_shuffle(进行洗牌操作) 3. tf.assign(赋值操作) 4.tf.convert_to_tensor(转换为tensor类型) 5.tf.add(相加操作) tf.divide(相乘操作) 6.tf.placeholder(输入数据占位
1. 使用tf.random_normal([2, 3], mean=-1, stddev=4) 创建一个正态分布的随机数 参数说明:[2, 3]表示随机数的维度,mean表示平均值,stddev表示 ...
- 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)
1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说 ...
- 深度学习原理与框架-Tfrecord数据集的制作 1.tf.train.Examples(数据转换为二进制) 3.tf.image.encode_jpeg(解码图片加码成jpeg) 4.tf.train.Coordinator(构建多线程通道) 5.threading.Thread(建立单线程) 6.tf.python_io.TFR(TFR读入器)
1. 配套使用: tf.train.Examples将数据转换为二进制,提升IO效率和方便管理 对于int类型 : tf.train.Examples(features=tf.train.Featur ...
随机推荐
- linux下recv 、send阻塞、非阻塞区别和用法
非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模式 ...
- uoj#158. 【清华集训2015】静态仙人掌
http://uoj.ac/problem/158 预处理dfs序,询问转为区间1的个数,用可持久化bitset预处理出所有可能的修改对应哪些位置,然后用一个bitset维护当前每个点的状态,修改时可 ...
- Hadoop概念学习系列之Hadoop、Spark学习路线(很值得推荐)(十八)
不多说,直接上干货! 说在前面的话 此笔,对于仅对于Hadoop和Spark初中学者.高手请忽略! 1 Java基础: 视频方面: 推荐<毕向东JAVA基础视频教程>.学 ...
- MyBatis 手动映射结果集
MyBatis可以自动将查询结果封装到bean中,前提条件是bean的属性名和查询的结果列名相同,就会一次对应存储. 如果查询结果的列名和bean的属性名不一致,则需要手动映射结果集 <!-- ...
- 廖雪峰Java2面向对象编程-6Java核心类-3包装类型
Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...
- 在CentOS-6.9里安装openvswitch-2.5.4
第一步:安装依赖 yum install rpm-build openssl-devel gcc wgetyum install python-devel kernel-devel kernel-de ...
- 判断Service是否已经启动
/** 查看服务是否开启*/ public static Boolean isServiceRunning(Context context, String serviceName) { ...
- synchronous-request-with-websockets
https://stackoverflow.com/questions/13417000/synchronous-request-with-websockets
- Unreal Engine 4 Smear Frame效果的实现与分析
转自:http://www.52vr.com/article-868-1.html 这篇文章介绍了类似守望先锋中的帧转移模糊(Smear Frame)效果. 该效果由Jan Kaluza实现,本博 ...
- POJ3635 Full Tank?
[题解] 用dijkstra算法求最短路.同时考虑在每个节点加油(一单位)与否. [代码] #include <iostream> #include <map> #includ ...