瞎扯淡的部分
keras其实是高度封装的一个神经网络模块,优点就是可以很方便的进行开发,缺点就是很多情况下只能用现成的Layer去构建模型,比如我需要用神经网络去进行控制,那么在控制量和输出量两层中间,使用keras是很难实现误差的反向传播(Back Propagation)的。
由于作业要求,开始使用Paddle进行神经网络搭建,从一头雾水到现在还是一头雾水,总得写点东西(其实是作业要求) 去记录一下,万一以后开发会用到呢(狗头)。
Keras模型文件
数据生成
这一部分使用numpy生成数据,可直接搬到Paddle中。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#================================
#准备数据
N = 100 #每个类别100个样本
D = 2 #维度
K = 3 #3类
X = np.zeros((N*K,D)) #一个300乘2的矩阵
y = np.zeros((N*K),dtype='uint8')
for j in range(K):
ix = list(range(N*j, 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[ix] = np.c_[r*np.sin(t), r*np.cos(t)] #对矩阵每个元素取正弦
y[ix] = j
# 展示数据
x1 = X
x2 = x1[:100]
x2 = x2.T
y2 = y[:100]
x3 = x1[100:200]
x3 = x3.T
y3 = y[100:200]
x4= x1[200:]
x4 = x4.T
y4 = y[200:]
plt.figure(figsize=(10, 10))
plt.plot(x2[0],x2[1],'o')
plt.plot(x3[0],x3[1],'o')
plt.plot(x4[0],x4[1],'o')
plt.show()
定义模型
这一部分开始定义模型,主要是使用Keras的两种定义模型的方式:
from keras.layers import *
from keras.models import Model
from sklearn.model_selection import train_test_split
#sklearn用来划分训练集和交叉验证集
# 使用sequential定义两层模型
model_in = Input(shape=(2,))
model_out = Dense(10,input_dim=(2),activation='relu')(model_in)
model_out = Dense(3,activation='softmax')(model_out)
model = Model(model_in,model_out)
# model = Sequential()
# model.add(Dense(10, input_shape=(2, )))
# model.add(Activation('relu'))
# model.add(Dense(3))
# model.add(Activation('softmax'))
- sequential序列模型。这种方式可构建简单的神经网络模型,只需要加入层、加入激活函数,一层一层按顺序叠加即可完成,但是无法实现多输入/多输出/残差网络。
- 使用Model类进行创建。这种方式一般是使用函数来进行封装,返回一个Model对象,要实例一个Model类,需要指定Input和Output层。这种方式可用进行残差块的构建、多输入多输出神经网络的搭建。
搭建多输入/多输出网络可以参考这篇博文
下面是残差块的实现,主要是使用Add()方法,这里是截取了一部分Xception网络的代码。
注意这里是用的Keras的Add(),相类似的还有一个concatenate,这两个并不相同,可以参考这篇博文
residual = Conv2D(256, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)
residual = BatchNormalization(axis=channel_axis)(residual)
#构建短跳连接,因为原始X和主线路输出X的大小不同,因此需要进行卷积
x = Activation('relu', name='block3_sepconv1_act')(x)
x = SeparableConv2D(256, (3, 3),padding='same',use_bias=False,name='block3_sepconv1')(x)
x = BatchNormalization(axis=channel_axis, name='block3_sepconv1_bn')(x)
x = Activation('relu', name='block3_sepconv2_act')(x)
x = SeparableConv2D(256, (3, 3),padding&#