Paddle模型搭建-从keras转换为Paddle

本文记录了将Keras模型转换为Paddle的过程,包括数据生成、模型定义、模型转换、配置和训练。重点介绍了Paddle中数据生成、模型构建、优化器、损失函数和评估指标的设置,以及动态图训练模型的实现。
摘要由CSDN通过智能技术生成

瞎扯淡的部分

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'))
  1. sequential序列模型。这种方式可构建简单的神经网络模型,只需要加入层、加入激活函数,一层一层按顺序叠加即可完成,但是无法实现多输入/多输出/残差网络。
  2. 使用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&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值