认真学习,佛系更博。
最近抽空开发了一个基于numpy的简易版的神经网络框架,类似于keras的调用方法,该框架不强烈追求网络学习的效率,旨在更好地理解神经网络模型的原理;特此记录,也期待和别人分享;
我们想实现的终极目标是:使用自己开发的框架可以方便的搭建、训练、预测数据的类别,如下面代码:
if __name__ == '__main__':
data_handler = ImageHandler("dataset", gray=True, flatten=False, use_scale=True)
train_data, train_label, test_data, test_label = data_handler.get_data(ratio=0.2)
model = Sequential()
model.add(Conv2D(filters=32, optimizer="adam", strides=1, kernel_size=(2, 2), name="conv1",
padding="valid", input_shape=(28, 28, 1)))
model.add(BatchNormalization())
model.add(Relu())
model.add(MaxPool2D(size=2))
model.add(Conv2D(filters=64, optimizer="adam", padding="valid", name="conv2", strides=1))
model.add(BatchNormalization())
model.add(Relu())
model.add(MaxPool2D(size=2))
model.add(Flatten())
model.add(Dense(kernel_size=64, optimizer="adam"))
model.add(BatchNormalization())
model.add(Sigmoid())
model.add(Dense(kernel_size=10, activation="sigmoid", optimizer="adam"))
model.compile(loss="cross_entropy", lr=0.01)
model.summary()
model.fit(train_data, train_label, epoch=20)
其调用方式类似于keras,可以很方便地叠加各个层,使用compile编译模型(初始化),summary输出网络结构,fit训练模型。
为了实现该功能,我们将代码主要分为4个模块:
- 数据处理模块,见上诉代码的ImageHandler;
- 网络层模块,该模块实现各种神经网络结构,如全连接层、卷积层、dropout层、batch_normalization、flatten层等;
- 模型模块,为了简化系统,我们只实现了keras的管道模型,但这不影响我们理解神经网络的原理,见上述Sequential;
- 其他,包括误差计算模块、优化器模块等;我们将实现2种误差计算方法(mse、cross_entropy),5种优化器(sgd、momentum、adagrad、rmsprop、adam)
整个代码放在github上:https://github.com/darkwhale/neural_network ;
下一章将从模块1开始,一步一步实现我们自己的神经网络框架。