ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Keras的三种建模方式

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.labelsreturn 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.labelsreturn 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.labelsreturn 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 xtrain_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 outputsmodel = 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、评估模型和预测

返回列表