使用keras进行简单网络训练

代码参考书籍《深度学习实战:基于Tensorflow2和Keras(原书第2版)》

分别尝试了简单神经网络搭建、增加网络深度(层数)、使用dropout方式训练三种方法。

1、不使用隐藏层的简单神经网络

# -*- coding: utf-8 -*-
"""
不使用隐藏层的简单神经网络
@Time : 2022/3/22 23:10
@Auth : Eve
@File :01.py
@IDE :PyCharm
"""
import tensorflow as tf
import numpy as np
from tensorflow import keras

# 10个类别
NB_CLASSES = 10
# 28*28=784个神经元
RESHAPED = 784

EPOCHS = 200
BATCH_SIZE = 128
# 日志显示  0 为不在标准输出流输出日志信息
# 1 为输出进度条记录
# 2 为每个epoch输出一行记录
VERBOSE = 1
N_HIDDEN = 128
VALIDATION_SPLIT = 0.2

# load data
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.reshape(60000, RESHAPED)
X_test = X_test.reshape(10000, RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

X_train /= 255
X_test /= 255

print(X_train.shape[0])
print(X_test.shape[0])


# 对标签进行one-hot编码处理
Y_train = tf.keras.utils.to_categorical(Y_train, NB_CLASSES)
Y_test = tf.keras.utils.to_categorical(Y_test, NB_CLASSES)

# build the model  创建模型
model = tf.keras.models.Sequential()
model.add(keras.layers.Dense(
    NB_CLASSES,
    input_shape=(RESHAPED,)
    , kernel_initializer='zeros'
    , name='dense_layer'
    , activation='softmax'
))

# compiling the model  编译模型
model.compile(
    optimizer='SGD'
    , loss='categorical_crossentropy'
    , metrics=['accuracy']
)

# training the model
model.fit(
    X_train
    , Y_train
    , batch_size=BATCH_SIZE
    , epochs=EPOCHS
    , verbose=VERBOSE
    , validation_split=VALIDATION_SPLIT
)

# evaluate the model
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy:{}'.format(test_acc))

# 关于输出的准确率
"""
accuracy: 0.9229  训练集准确率
val_accuracy: 0.9237  验证集准确率
Test accuracy:0.922399  测试集准确率
"""
tf.keras.utils.plot_model(model, to_file='model.png')

2、添加两层中间层的神经网络

# -*- coding: utf-8 -*-
"""
添加两层中间层的神经网络
@Time : 2022/3/23 22:14
@Auth : Eve
@File :01_add_dense.py
@IDE :PyCharm
"""
import tensorflow as tf
import numpy as np
from tensorflow import keras

# 10个类别
NB_CLASSES = 10
# 28*28=784个神经元
RESHAPED = 784

EPOCHS = 50
BATCH_SIZE = 128  # 这个参数可以修改,不一定是2的指数

# 日志显示  0 为不在标准输出流输出日志信息
# 1 为输出进度条记录
# 2 为每个epoch输出一行记录
VERBOSE = 1

N_HIDDEN = 120   # 这个参数可以修改,不一定是2的指数
VALIDATION_SPLIT = 0.2

# load data
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.reshape(60000, RESHAPED)
X_test = X_test.reshape(10000, RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

X_train /= 255
X_test /= 255

print(X_train.shape[0])
print(X_test.shape[0])


# 对标签进行one-hot编码处理
Y_train = tf.keras.utils.to_categorical(Y_train, NB_CLASSES)
Y_test = tf.keras.utils.to_categorical(Y_test, NB_CLASSES)

# build the model  创建模型
model = tf.keras.models.Sequential()
# 加入两个隐藏层
model.add(
    keras.layers.Dense(N_HIDDEN
                        , input_shape=(RESHAPED,)
                        , name='dense_layer_1'
                        , activation = 'relu'))
model.add(
    keras.layers.Dense(N_HIDDEN
                      , name='dense_layer_2'
                      , activation = 'relu')
)
model.add(keras.layers.Dense(
    NB_CLASSES
    , name='dense_layer'
    , activation='softmax'
))
model.summary()

# compiling the model  编译模型
model.compile(
    optimizer='SGD'
    , loss='categorical_crossentropy'
    , metrics=['accuracy']
)

# training the model
model.fit(
    X_train
    , Y_train
    , batch_size=BATCH_SIZE
    , epochs=EPOCHS
    , verbose=VERBOSE
    , validation_split=VALIDATION_SPLIT
)

# evaluate the model
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy:{}'.format(test_acc))

"""
accuracy: 0.9721
val_accuracy: 0.9639
Test accuracy:0.964999
"""

3、添加dropout的神经网络

# -*- coding: utf-8 -*-
"""
添加dropout的神经网络
@Time : 2022/3/23 22:32
@Auth : Eve
@File :01_dropout.py
@IDE :PyCharm
"""
import tensorflow as tf
import numpy as np
from tensorflow import keras

# 10个类别
NB_CLASSES = 10
# 28*28=784个神经元
RESHAPED = 784

EPOCHS = 50
BATCH_SIZE = 128
# 日志显示  0 为不在标准输出流输出日志信息
# 1 为输出进度条记录
# 2 为每个epoch输出一行记录
VERBOSE = 1
N_HIDDEN = 128
VALIDATION_SPLIT = 0.2
DROPOUT=0.3

# load data
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.reshape(60000, RESHAPED)
X_test = X_test.reshape(10000, RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

X_train /= 255
X_test /= 255

print(X_train.shape[0])
print(X_test.shape[0])


# 对标签进行one-hot编码处理
Y_train = tf.keras.utils.to_categorical(Y_train, NB_CLASSES)
Y_test = tf.keras.utils.to_categorical(Y_test, NB_CLASSES)

# build the model  创建模型
model = tf.keras.models.Sequential()
# 加入两个隐藏层
model.add(
    keras.layers.Dense(N_HIDDEN
                        , input_shape=(RESHAPED,)
                        , name='dense_layer_1'
                        , activation = 'relu'))
# 添加丢弃
model.add(keras.layers.Dropout(DROPOUT))
model.add(
    keras.layers.Dense(N_HIDDEN
                      , name='dense_layer_2'
                      , activation = 'relu')
)
# 添加丢弃
model.add(keras.layers.Dropout(DROPOUT))
model.add(keras.layers.Dense(
    NB_CLASSES
    , name='dense_layer'
    , activation='softmax'
))
model.summary()

# compiling the model  编译模型
model.compile(
    optimizer='SGD'
    , loss='categorical_crossentropy'
    , metrics=['accuracy']
)

# training the model
model.fit(
    X_train
    , Y_train
    , batch_size=BATCH_SIZE
    , epochs=EPOCHS
    , verbose=VERBOSE
    , validation_split=VALIDATION_SPLIT
)

# evaluate the model
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy:{}'.format(test_acc))

"""
accuracy: 0.9480
val_accuracy: 0.9651
Test accuracy:0.96280
"""

tf.keras.utils.plot_model(model, to_file='model_dropout.png')
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值