Keras的三种建模方式

以mnist为例,展示三种建模方式:

1、序列模型

from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Sequential
from keras.models import load_model
from keras.layers import Dense

#载入数据
def read_data(path):
    mnist=input_data.read_data_sets(path,one_hot=True)
    train_x,train_y=mnist.train.images,mnist.train.labels,
    valid_x,valid_y=mnist.validation.images,mnist.validation.labels,
    test_x,test_y=mnist.test.images,mnist.test.labels
    return train_x,train_y,valid_x,valid_y,test_x,test_y

#序列模型
def DNN(train_x,train_y,valid_x,valid_y):
    #创建模型
    model=Sequential()
    model.add(Dense(64,input_dim=784,activation='relu'))
    model.add(Dense(128,activation='relu'))
    model.add(Dense(10,activation='softmax'))
    #查看网络结构
    model.summary()
    #编译模型
    model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
    #训练模型
    model.fit(train_x,train_y,batch_size=500,nb_epoch=100,verbose=2,validation_data=(valid_x,valid_y))
    #保存模型
    model.save('sequential.h5')
   
train_x,train_y,valid_x,valid_y,test_x,test_y=read_data('MNIST_data')
DNN(train_x,train_y,valid_x,valid_y)

model=load_model('sequential.h5')  #下载模型
pre=model.evaluate(test_x,test_y,batch_size=500,verbose=2)  #评估模型
print('test_loss:',pre[0],'- test_acc:',pre[1])

2、函数模型

from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Model
from keras.models import load_model
from keras.layers import Input,Dense

#载入数据
def read_data(path):
    mnist=input_data.read_data_sets(path,one_hot=True)
    train_x,train_y=mnist.train.images,mnist.train.labels,
    valid_x,valid_y=mnist.validation.images,mnist.validation.labels,
    test_x,test_y=mnist.test.images,mnist.test.labels
    return train_x,train_y,valid_x,valid_y,test_x,test_y

#函数模型
def DNN(train_x,train_y,valid_x,valid_y):
    #创建模型
    inputs=Input(shape=(784,))
    x=Dense(64,activation='relu')(inputs)
    x=Dense(128,activation='relu')(x)
    output=Dense(10,activation='softmax')(x)
    model=Model(input=inputs,output=output)
    #查看网络结构
    model.summary()
    #编译模型
    model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
    #训练模型
    model.fit(train_x,train_y,batch_size=500,nb_epoch=100,verbose=2,validation_data=(valid_x,valid_y))
    #保存模型
    model.save('fun_model.h5')
   
train_x,train_y,valid_x,valid_y,test_x,test_y=read_data('MNIST_data')
DNN(train_x,train_y,valid_x,valid_y)

model=load_model('fun_model.h5')  #下载模型
pre=model.evaluate(test_x,test_y,batch_size=500,verbose=2)  #评估模型
print('test_loss:',pre[0],'- test_acc:',pre[1])

3、子类模型

from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Model
from keras.layers import Dense

#载入数据
def read_data(path):
    mnist=input_data.read_data_sets(path,one_hot=True)
    train_x,train_y=mnist.train.images,mnist.train.labels,
    valid_x,valid_y=mnist.validation.images,mnist.validation.labels,
    test_x,test_y=mnist.test.images,mnist.test.labels
    return train_x,train_y,valid_x,valid_y,test_x,test_y

#子类模型
class DNN(Model):
    def __init__(self):
        super(DNN,self).__init__()
        #初始化网络结构
        self.dense1=Dense(64,input_dim=784,activation='relu')
        self.dense2=Dense(128,activation='relu')
        self.dense3=Dense(10,activation='softmax')
        
    def call(self,inputs):  #回调顺序
        x=self.dense1(inputs)
        x=self.dense2(x)
        x=self.dense3(x)
        return x
   
train_x,train_y,valid_x,valid_y,test_x,test_y=read_data('MNIST_data')
model=DNN()
#编译模型
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
#训练模型
model.fit(train_x,train_y,batch_size=500,nb_epoch=100,verbose=2,validation_data=(valid_x,valid_y))
#查看网络结构
model.summary()

pre=model.evaluate(test_x,test_y,batch_size=500,verbose=2)  #评估模型
print('test_loss:',pre[0],'- test_acc:',pre[1])

常见损失函数:

mse #均方差(回归)

mae #绝对误差(回归)

binary_crossentropy #二值交叉熵(二分类,逻辑回归)

categorical_crossentropy #交叉熵(多分类)

对比另外一种编程方式的三种建模对比:

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
 
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
 
# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
 
# -----------------------------
# 使用序列模型建立模型
model = Sequential([
    Dense(64, activation='relu', input_shape=(784,)),
    Dense(10, activation='softmax')
])
 
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
 
# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))
 
# 模型评估
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)

 

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
 
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
 
# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
 
 
# 使用函数式模型建立模型
inputs = tf.keras.Input(shape=(784,))
x = Dense(64, activation='relu')(inputs)
outputs = Dense(10, activation='softmax')(x)
 
model = tf.keras.Model(inputs=inputs, outputs=outputs)
 
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))
 
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
 
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
 
# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
 
 
# 使用子类模型建立模型
class MyModel(tf.keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.dense1 = Dense(64, activation='relu')
        self.dense2 = Dense(10, activation='softmax')
 
    def call(self, inputs):
        x = self.dense1(inputs)
        outputs = self.dense2(x)
        return outputs
 
model = MyModel()
 
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))
 
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)

总结:

这是网上找到的代码,相比第一种上面的对于下面的三种keras的建模,下面的更加好理解,上面的更加优美。Keras的一般建模流程:

1、创建Model

2、compile编译初始化

3、fit训练

4、保存模型

5、评估模型和预测

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值