第一次实现单层神经网络
来源:互联网 发布:全球电视直播软件apk 编辑:程序博客网 时间:2024/05/01 12:37
看了吴恩达的课程,按他的公式做了一下编程练习。
题目是训练209*64*64*3的209张图片,再预测50*64*64*3的50张图片。
代码如下:
import numpy as npimport h5py #加载数据集def load_dataset(): train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r") train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels test_dataset = h5py.File('datasets/test_catvnoncat.h5', "r") test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels classes = np.array(test_dataset["list_classes"][:]) # the list of classes train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0])) test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0])) return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes#激活函数activition functiondef ReLU(z): mz,nz = z.shape zero = np.zeros((mz,nz)) return np.maximum(zero,z)#RuntimeWarning: overflow encountered in expdef sigmoid(z): return 1.0/(1+np.exp(-z))#将4维数组转换为2维def transformArray(inX): shape = inX.shape shape1 = shape[1]*shape[2]*shape[3] transformedX = np.mat(np.zeros((shape1,shape[0]))) for i,item in enumerate(inX): transformedItem = item.flatten().reshape(-1,1) transformedX[:,i] = transformedItem return transformedX#损失函数def lossFunc(A,y_train): pass #单层神经网络class myOneLNN: def __init__(self,W1,b1,alpha,af,iterNum): self.W = W1 self.b = b1 self.af = af self.iterNum = iterNum self.alpha = alpha def trainFunc(self,X_train,y_train): m = X_train.shape[1] X = X_train Y = y_train Z = self.W*X + self.b for i in range(iterNum): Z = self.W*X + self.b# Z1 = np.dot(self.W,X)+b# print(Z1.shape) A = self.af(Z) dZ = A - Y dW = dZ*X.T/m db = np.sum(dZ)/m self.W -= self.alpha*dW self.b -= self.alpha*db return self.W,self.b def predictFunc(self,X_test): Z_pred = self.W*X_test + self.b '''此处为什么A_pred和y_pred是一样的?''' A_pred = self.af(Z_pred)# print(A_pred) y_pred = np.zeros(A_pred.shape) y_pred[0,np.nonzero(A_pred>0.5)[1]] = 1.0 return y_pred def testErrors(self,y_test,y_pred): m = y_test.shape[1] errors = len(np.nonzero(y_test!=y_pred)[0]) errorRate = errors*1.0/m# print('the total error number is: %d'%errors)# print('the error rate is: %.2f'%errorRate) return errorRateX_train,y_train,X_test,y_test,classes = load_dataset()#将数据集转换为2维:是否有更好的方法?X_train_transformed = transformArray(X_train)X_test_transformed = transformArray(X_test)L = 1 #1 layersn0 = X_train_transformed.shape[0] #输入样本的维度m = X_train_transformed.shape[1] #训练样本个数为mn1 = 1 #输出层单元数为1个W1 = np.random.randn(n1,n0)*0.001 #随机初始化W'''按公式,此处b和m有关,但测试集的m和训练集的m不相等,运行会出错个人觉得b的shape应该是(ni*1),ni为第i层单元的个数'''#b1 = np.zeros((n1,m)) #b可以初始化为0b1 = 0iterNum = 500#交叉验证errList = []for i in range(10): oneLNN = myOneLNN(W1,b1,alpha=0.001,af=sigmoid,iterNum=iterNum) W,b = oneLNN.trainFunc(X_train_transformed,y_train) y_pred = oneLNN.predictFunc(X_test_transformed) errorRate = oneLNN.testErrors(y_test,y_pred) errList.append(errorRate)print(errList)print(np.mean(errList))单层神经网络的错误率为28%,遇到np.exp计算溢出的问题,暂时找不到好的解决方案。有任何问题欢迎交流。
阅读全文
0 0
- 第一次实现单层神经网络
- 单层卷积神经网络的实现
- 单层神经网络
- 译文 | 与TensorFlow的第一次接触 第四章:单层神经网络
- 人工神经网络(三)单层感知器代码实现
- 人工神经网络(三)单层感知器代码实现
- 简单的单层神经网络的实现,附代码
- TensorFlow入门(3)-单层神经网络实现方法
- 单层感知器神经网络
- Tensorflow 搭建神经网络(单层)
- 参数自适应的单层 bp 神经网络
- Tensorflow学习:单层神经网络的建立
- 神经网络学习之单层感知器
- 基于numpy+pandas的单层神经网络
- 人工神经网络(二)单层感知器
- 人工神经网络(二)单层感知器
- 神经网络中单层神经元表示逻辑运算
- 使用nntool神经网络工具箱建立单层感知器
- 生成式对抗网络Generative Adversarial Networks(GANs)
- StretchDIBits显示8位图问题
- JavaScript---Object.defineProperty()与两种属性描述符简介->数据\存取描述符
- java IO流
- Android界面百分比适配-PercentRelativeLayout
- 第一次实现单层神经网络
- hdu_6186_前缀后缀_水_死于英语
- Activity的启动模式
- ActiveMQ笔记——技术点汇总
- 最全Pycharm教程(18)——Pycharm编辑器功能之代码拼写提示
- LeetCode
- 设计模式 ----- 策略模式
- irst-missing-positive
- 制作java程序安装包