用tensorflow搭建简单神经网络测试iris 数据集和MNIST 数据集

Posted yangyuxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用tensorflow搭建简单神经网络测试iris 数据集和MNIST 数据集相关的知识,希望对你有一定的参考价值。

1.步骤

第一步:import 相关模块,如 import tensorflow as tf

第二步:指定输入网络的训练集和测试集,如指定训练集的输入 x_train 和标签y_train,测试集的输入 x_test 和标签 y_test。 

第三步:逐层搭建网络结构,model = tf.keras.models.Sequential()。 

第四步:在 model.compile()中配置训练方法,选择训练时使用的优化器、损失函数和最终评价指标。 

第五步:在 model.fit()中执行训练过程,告知训练集和测试集的输入值和标签、每个 batch 的大小(batchsize)和数据集的迭代次数(epoch)。 

第六步:使用 model.summary()打印网络结构,统计参数数目。

2.函数用法介绍 

tf.keras.models.Sequential():          Sequential 函数是一个容器,描述了神经网络的网络结构,在 Sequential函数的输入参数中描述从输入层到输出层的网络结构。

Model.compile( optimizer = 优化器, loss = 损失函数, metrics = [“准确率”])      Compile 用于配置神经网络的训练方法,告知训练时使用的优化器、损失函数和准确率评测标准。

其中: 

optimizer 可以是字符串形式给出的优化器名字,也可以是函数形式,使用函数形式可以设置学习率、动量和超参数。

可选项包括:
‘sgd’or tf.optimizers.SGD( lr=学习率, decay=学习率衰减率, momentum=动量参数)
‘adagrad’or tf.keras.optimizers.Adagrad(lr=学习率, decay=学习率衰减率)
‘adadelta’or tf.keras.optimizers.Adadelta(lr=学习率, decay=学习率衰减率)
‘adam’or tf.keras.optimizers.Adam (lr=学习率, decay=学习率衰减率)

Loss 可以是字符串形式给出的损失函数的名字,也可以是函数形式。

 可选项包括: 

‘mse’or tf.keras.losses.MeanSquaredError() ‘sparse_categorical_crossentropy or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)

损失函数常需要经过 softmax 等函数将输出转化为概率分布的形式。from_logits 则用来标注该损失函数是否需要转换为概率的形式,取 False 时表示转化为概率分布,取 True 时表示没有转化为概率分布,直接输出。

Metrics 标注网络评测指标

可选项包括: 

‘accuracy’:y_和 y 都是数值,如 y_=[1] y=[1]。 ‘categorical_accuracy’:y_和 y 都是以独热码和概率分布表示。 如 y_=[0, 1, 0], y=[0.256, 0.695, 0.048]。

‘sparse_ categorical_accuracy’:y_是以数值形式给出,y 是以独热码形式给出。 如 y_=[1],y=[0.256, 0.695, 0.048]。

model.fit(训练集的输入特征, 训练集的标签, batch_size, epochs, validation_data = (测试集的输入特征,测试集的标签), validataion_split = 从测试集划分多少比例给训练集, validation_freq = 测试的 epoch 间隔次数)     fit 函数用于执行训练过程   

model.summary()      summary 函数用于打印网络结构和参数统计 

3.搭建网络训练iris 数据集如下:

 1 import tensorflow as tf
 2 from sklearn import datasets
 3 import numpy as np
 4 
 5 x_train = datasets.load_iris().data
 6 y_train = datasets.load_iris().target
 7 
 8 np.random.seed(116)
 9 np.random.shuffle(x_train)
10 np.random.seed(116)
11 np.random.shuffle(y_train)
12 tf.random.set_seed(116)
13 
14 model = tf.keras.models.Sequential([
15     tf.keras.layers.Dense(3, activation=softmax, kernel_regularizer=tf.keras.regularizers.l2())
16 ])
17 
18 model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
19               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
20               metrics=[sparse_categorical_accuracy])
21 
22 model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
23 
24 model.summary()
 1 import tensorflow as tf
 2 from tensorflow.keras.layers import Dense
 3 from tensorflow.keras import Model
 4 from sklearn import datasets
 5 import numpy as np
 6 
 7 x_train = datasets.load_iris().data
 8 y_train = datasets.load_iris().target
 9 
10 np.random.seed(116)
11 np.random.shuffle(x_train)
12 np.random.seed(116)
13 np.random.shuffle(y_train)
14 tf.random.set_seed(116)
15 
16 class IrisModel(Model):
17     def __init__(self):
18         super(IrisModel, self).__init__()
19         self.d1 = Dense(3, activation=softmax, kernel_regularizer=tf.keras.regularizers.l2())
20 
21     def call(self, x):
22         y = self.d1(x)
23         return y
24 
25 model = IrisModel()
26 
27 model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
28               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
29               metrics=[sparse_categorical_accuracy])
30 
31 model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
32 model.summary()

以上两段代码的不同之处是,第一段是用Sequential搭建网络,第二段是自定义网络。

4.搭建网络训练MNIST 数据集 如下:

 1 import tensorflow as tf
 2 
 3 mnist = tf.keras.datasets.mnist
 4 (x_train, y_train), (x_test, y_test) = mnist.load_data()
 5 x_train, x_test = x_train / 255.0, x_test / 255.0
 6 
 7 model = tf.keras.models.Sequential([
 8     tf.keras.layers.Flatten(),
 9     tf.keras.layers.Dense(128, activation=relu),
10     tf.keras.layers.Dense(10, activation=softmax)
11 ])
12 
13 model.compile(optimizer=adam,
14               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
15               metrics=[sparse_categorical_accuracy])
16 
17 model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
18 model.summary()
 1 import tensorflow as tf
 2 from tensorflow.keras.layers import Dense, Flatten
 3 from tensorflow.keras import Model
 4 
 5 mnist = tf.keras.datasets.mnist
 6 (x_train, y_train), (x_test, y_test) = mnist.load_data()
 7 x_train, x_test = x_train / 255.0, x_test / 255.0
 8 
 9 
10 class MnistModel(Model):
11     def __init__(self):
12         super(MnistModel, self).__init__()
13         self.flatten = Flatten()
14         self.d1 = Dense(128, activation=relu)
15         self.d2 = Dense(10, activation=softmax)
16 
17     def call(self, x):
18         x = self.flatten(x)
19         x = self.d1(x)
20         y = self.d2(x)
21         return y
22 
23 
24 model = MnistModel()
25 
26 model.compile(optimizer=adam,
27               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
28               metrics=[sparse_categorical_accuracy])
29 
30 model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
31 model.summary()

不同之处也是在搭建网络时使用的方法不同

 

以上是关于用tensorflow搭建简单神经网络测试iris 数据集和MNIST 数据集的主要内容,如果未能解决你的问题,请参考以下文章

学会用tensorflow搭建简单的神经网络 2

TensorFlow 用TensorFlow实现弹性网络回归算法(多线性回归)

神经网络一(用tensorflow搭建简单的神经网络并可视化)

tensorflow学习之搭建最简单的神经网络

Tensorflow Keras 修改 Iris 示例时形状不兼容

tensorflow 网站上的 iris 教程不好用