单个神经元模型训练
通过一个神经元来训练最简单的Y=2X-1数据模型,并预测X=10,Y的值。 这个过程其实是对数据的猜测+验证的过程,训练了500次。
关键词:
overfitting拟合
import tensorflow as tf
import numpy as np
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
print(tf.__version__)
model = Sequential([Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
model.fit(xs, ys, epochs=500)
print(model.predict([10.0]))
预测x=10的情况下,y的值为如下:
可以看到模型得到的其实是一个无限接近我们希望的正确答案的一个值。
训练fashion_mnist 28*28的灰度图像数据集
6万个数据集+1万个测试数据集
data = tf.keras.datasets.fashion_mnist
//通过tf.keras.datasets可以直接访问fashion_mnist数据集
//通过load_data可以得到6万个数据集+1万个测试集
(training_images, training_labels), (test_images, test_labels) = data.load_data()
// 因为图片是灰度的,每个像素都在0-255之间,/255可以得到归一化的数据,即0和1表示每个像素
training_images = training_images / 255.0
test_images = test_images / 255.0
model_fashion=tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28,28)),
// 128个神经元,不多不少的选择。多和少都会有影响,多预测会变慢
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax),
])
model_fashion.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model_fashion.fit(training_images, training_labels, epochs=50)
// 针对测试数据集的模型准确度
model_fashion.evaluate(test_images, test_labels)
// 通过训练后的模型预测1万个测试数据集
classifications = model_fashion.predict(test_images)
// 得到1万个测试数据集中index=0的数据的预测分数,结果是一个数组,包含10个数值,最后一个代表最终的模型预测分数,大概是0.91,即91%的概率。
print(classifications[0])
// 得到1万个测试数据集中index=0的图片标注的label,这里看到是9.
// 所以最终模型输出的index=0的图片通过模型预测后得到的分数是91%的概率是label为9
print(test_labels[0])
如下图所示:
这里其实看到模型预测index=0的测试图片分数已经达到了99.9%,原因是我们这里训练了50次,模型的精度有了提升。
这里还有一个概念就是
loss:损失,损失越小,说明这个模型越接近数据本身的规律或者效果。
accuracy:精度,精度越高,说明这个模型预测的准确性越高。
这里还有一个问题,我们把训练的次数从5提升到了50,可以看到精度提高了。但是实际的模型训练中,我们怎么知道训练多少次精度能够达到要求呢?这里有一个callback的方式来实现,即在训练方法中增加一个callback,如果我们模型的精度已经>某个值,比如0.95,那么终止训练。