实例:
x = − 1 , 0 , 1 , 2 , 3 , 4 ; y = − 3 , − 1 , 1 , 3 , 5 , 7 x= -1,0,1,2,3,4;y= -3,-1,1,3,5,7 x=−1,0,1,2,3,4;y=−3,−1,1,3,5,7
通过简单观察我们可以知道x与y满足的表达式:
y = 2 x − 1 y=2x-1 y=2x−1
那么如何让机器自己学习x与y之间的关系呢?
model=keras.Sequential([keras.layers.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])
代码解释:使用numpy将x与y的取值转成array,可以指定数据类型。
使用fit方法训练模型epochs指训练的次数,所有的数据训练一次为有一个epochs,epochs=500,就是指这些数据要跑500次,这个模型学习500次。
model.fit(xs,ys,epochs=500)
最后使用模型预测x=10.0时y的值是多少
我们代入y=2x-1,应该是19,但是输出未必正好是19,他可能是一个很接近19的一个值,神经网络会把y的取值当做一个概率的问题来做,结果就是概率最大情况的取值。
print(model.prediict([10.0]))
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
print(train_images.shape)
print(train_images[0])
print(test_images.shape)
print(train_labels[:5])
import matplotlib.pyplot as plt
plt.imshow(train_images[0])
一个三层的神经元网络结构:
model=keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))
-使用model.summary()看看网络结构
model.summary()
网络参数解读:
第二层:10480=784×128+128=100352+128
第三层:1290=10×(128+1)
model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
model.fit(train_images,train_labels)//未指定epochs,默认训练一次
model.fit(train_images,train_labels,epochs=5)
为了训练更好,我们可以对训练数据进行normalization 或者scalling,就让它变成 0 到1 之间的数。
train_images=train_images/255# #归一化变成0~1之间数
model.fit(train_images,train_labels,epochs=5)
运行结果:与未归一化相比,通过normalization训练中loss更小,准确度accuracy更高了,训练效果更好了。
模型训练完成后,我们可用test数据集评估模型的准确度
test_images_scaled=test_images/255
model.evaluate(test_images_scaled,test_labels)
我们看到loss比训练时有点增加,accuracy比训练是有点低,不过查德努什很多,说明模型训练的还是可以的!
import numpy as np
import matplotlib.pyplot as plt
print(np.argmax(model.predict([[(test_images[0]/255).reshape(1, 28, 28)]])))
print(test_labels[0])
plt.imshow(test_images[0])
我们看到loss比训练时有点增加,accuracy比训练是有点低,不过查德努什很多,说明模型训练的还是可以的
history = model.fit(train_images,train_labels,epochs=50,validation_split=0.3,shuffle=True)
epochs = len(history.history['loss']) #获取X轴长度
fig, axes = plt.subplots(2, sharex=True, figsize=(12, 8))
fig.suptitle('Training Metrics')
axes[0].set_ylabel("Loss", fontsize=14)
axes[0].set_xlabel("Epoch", fontsize=14)
axes[0].plot(range(epochs),history.history['loss'], label='Loss')
axes[0].plot(range(epochs),history.history['val_loss'], label='Loss')
plt.legend()
axes[1].set_ylabel("Accuracy(%)", fontsize=14)
axes[1].set_xlabel("Epoch", fontsize=14)
axes[1].plot(range(epochs),history.history['accuracy'], label='Accuracy')
axes[1].plot(range(epochs),history.history['val_accuracy'], label='Val_accuracy')
# plt.savefig('./epoch.jpg')
# plt.suptitle('自定义图表', fontsize=400, ha='center') # 即标题在x轴和y轴形成的方框内部,如下图(详细用法见下注释)。如果需要标题在这上方,使用 plt.title(blabla)
plt.legend()
plt.show()
运行结果:
从上图可以看出:loss与准确率曲线可以看出训练过拟合了,训练集的loss下降多,但是测试集的训练loss增加了,训练参数不匹配,我们可以通过调节训练次数对模型进行优化。
为了避免出现过拟合现象,我们可以设定一个条件,当满足该条件时,及时终止训练。
定义一个Callbacks的类传递给参数,每次训练都会调用这个类,当满足这个类的条件时,训练就会自动终止。
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs={}):
if(logs.get('loss')<0.4):
print("\nLoss is low so cancelling training!")
self.model.stop_training=True
callbacks=myCallback()
mnist=tf.keras.datasets.fashion_mnist
(training_images,training_labels),(test_images,test_labels)=mnist.load_data()
training_images_scaled=training_images/255.0
test_images_scaled=test_images/255.0
model=tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512,activation=tf.nn.relu),
tf.keras.layers.Dense(10,activation=tf.nn.softmax)
])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy')
model.fit(training_images_scaled,training_labels,epochs=5,callbacks=[callbacks])