keras实现单输入单输出的模型

文章目录

    • keras简介
    • 研究问题
    • 步骤
    • 全部使用全连接层神经网络
      • 1
      • 2
    • 简单总结

keras简介


  • keras是一个高层API,其底层实现有TensorFlow||CNTK||Theano,经过简单的配置可以任意切换底层实现框架.因为它的简单实用,所以keras框架饱受欢迎.

研究问题

使用全连接神经网络(写法不一样的demo)来实现手写数字的识别.

步骤

  1. 定义神经网络模型的结构(输入&输出&隐藏层结构)
  2. 数据准备
  3. 模型编译(定义损失函数&指标&优化器)
  4. 神经网络训练&拟合数据
  5. 模型训练数据的可视化
  6. 模型的评估

全部使用全连接层神经网络

1

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.datasets import mnist
import matplotlib.pyplot as plt
from migrate.versioning.util import load_model

# 创建一个简单的全连接神经网络
model = Sequential()
model.add(Dense(50, activation='relu'))
model.add(Dense(10, activation='softmax'))

# 数据准备
(x_train, y_train), (x_test, y_test) = mnist.load_data()
y1 = []
for i in range(len(y_train)):
    tmp = np.zeros([10])
    tmp[y_train[i]] = 1
    y1.append(tmp)
y2 = []
for i in range(len(y_test)):
    tmp = np.zeros([10])
    tmp[y_test[i]] = 1
    y2.append(tmp)
# 重新定义为单个序列行的数据
x_train = np.reshape(x_train, [-1,784])
y_train = np.array(y1)
x_test = np.reshape(x_test, [-1, 784])
y_test = np.array(y2)

# 模型的编译
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 模型的训练
history = model.fit(x_train, y_train, batch_size=800, epochs=80, verbose=1, validation_data=(x_test, y_test))
# 训练过程数据的可视化
# 绘制训练 & 验证的准确率值
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# 绘制训练 & 验证的损失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
# 保存模型
model.save('model.h5')

# 加载模型,测试训练出来的模型
my_model = load_model('model.h5')
result = my_model.evaluate(x_test, y_test, batch_size=32)
print(result)
  • 得到的准确率变化的过程
    keras实现单输入单输出的模型_第1张图片
  • 得到的损失值变化
    keras实现单输入单输出的模型_第2张图片

2

from keras import Input, Model
from keras.datasets import mnist
from keras.engine.saving import load_model
from keras.layers import Dense
import matplotlib.pyplot as plt
import numpy as np

# 模型定义
input = Input(shape=(784,), )
x = Dense(64, activation="relu")(input)
x = Dense(10, activation="softmax")(x)
model = Model(inputs=[input], outputs=[x])
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])

# 数据准备
(x_train, y_train), (x_test, y_test) = mnist.load_data()
y1 = []
for i in range(len(y_train)):
    tmp = np.zeros([10])
    tmp[y_train[i]] = 1
    y1.append(tmp)
y2 = []
for i in range(len(y_test)):
    tmp = np.zeros([10])
    tmp[y_test[i]] = 1
    y2.append(tmp)
# 重新定义为单个序列行的数据
x_train = np.reshape(x_train, [-1,784])
y_train = np.array(y1)
x_test = np.reshape(x_test, [-1, 784])
y_test = np.array(y2)

# 拟合数据
history = model.fit(x_train, y_train, batch_size=800, epochs=100, verbose=1, validation_data=(x_test, y_test))
model.save("model3.h5")

# 训练过程数据的可视化
# 绘制训练 & 验证的准确率值
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# 绘制训练 & 验证的损失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
  • 精度变化过程
    keras实现单输入单输出的模型_第3张图片
  • 损失值变化过程
    keras实现单输入单输出的模型_第4张图片

简单总结

  • 第一种方法是使用的Sequential,可以直接添加模型,这种实现方法比第二种方法更加的直观,对于单输入和单输出更加的友好.
  • 第二种方法使用的是把输入和输出分开定义,然后使用Model的方式关联在一起,这种方法相对于方法一来说,可能比较繁琐,但是更加的灵活.
  • 这两种方法都很简单很直观,效果都是一样的,仅仅只是写法不一样.
  • 在实现精度和损失值的可视化必须要使用验证集,否则没法使用keras的接口展示过程性的数据(除非自己实现相关的一些方法,我认为没必要).
  • 这里实现的是全连接层的神经网络,卷积神经网络的实现也很简单类似.

你可能感兴趣的:(keras,手写数字识别,全连接神经网络,编程)