model=tf.keras.Sequential()
>>> import tensorflow as tf
>>> model = tf.keras.Sequential()
>>> model
<tensorflow.python.keras.engine.sequential.Sequential object at 0x00000210D1ABFCC8>
model.add(tf.keras.layers...)
tf.keras.layers.Dense( # Dense表示全连接层
inputs # 输入该网络层的数据,表示这个层中神经元的个数
activation # 激活函数,以字符串的形式给出,如‘relu’、‘softmax’、‘sigmoid’、‘tanh’
input_shape # 输入数据的形状,全连接神经网络的第一层接受来自输入层的数据,必须要指定形状,后面的层接受前面一层的输出,不用再指明输入数据的情况
)
在定义神经网络之后,可以使用它的summary()方法来查看网络的结构和参数信息
model.summary()
>>> import tensorflow as tf
>>>
>>> model = tf.keras.Sequential()
>>> model.add(tf.keras.layers.Dense(8,activation="relu",input_shape=(4,))) # 添加第一层
隐含层,其中有8个神经元,采用relu函数作为激活函数,输入数据的形状为4
>>> model.add(tf.keras.layers.Dense(4,activation="relu")) # 添加第二层隐含层,relu激活
函数,采用上层输出作为输出,不用说明输入
>>> model.add(tf.keras.layers.Dense(3,activation="softmax")) # 添加输出层
>>>
>>> model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 8) 40
_________________________________________________________________
dense_1 (Dense) (None, 4) 36
_________________________________________________________________
dense_2 (Dense) (None, 3) 15
=================================================================
Total params: 91
Trainable params: 91
Non-trainable params: 0
_________________________________________________________________
也可以采用下面形式,直接将其作为参数,建议大家使用第一种方式
model = tf.keras.Sequential([
tf.keras.layers.Dense(8,activation="relu",input_shape=(4,)),
tf.keras.layers.Dense(4,activation="relu"),
tf.keras.layers.Dense(3,activation="softmax")])
model.compile(loss,optimizer,metrics)
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.CategoricalAccuracy()])
其中的参数全部采用字符串形式
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['sparse_categorical_accuracy'])
model.fit(训练集的输入特征,训练集的标签,
batch_size = 批量大小,
epochs = 迭代次数,
shuffle = 是否每轮训练之前打乱数据,默认为true
validation_data = (测试集的输入特征,测试集的标签),这个参数和下面那个参数是二选一的,如果同时给出,data将覆盖比例
validation_split = 从训练集划分多少比例给测试集,取值为0~1
validation_freq = 测试频率,每隔多少论训练,输出一次评测指标
verbose = 日志显示形式,0:不再标准输出流输出;1:输出进度条记录;2:每个epoch输出一次记录
)
model.fit(x=None,y=None,batch_size=32,epochs=1,shuffle=True,validation_data=None,validation_split=0.0,validation_freq=1,verbose=1)
history = model.fit(X_train,y_train,batch_size=32,epochs=5,validation_split=0.2)
history.history # 可以使用这查看列表储存的信息
model.evaluate(test_set_x,test_set_y,batch_size,verbose)
第一个返回值是损失,第二个返回值是在model.compile()方法中指定的性能指标
训练好模型之后,就可以使用它来进行分类了,通过模型的predict方法来实现
model.predict(x,batch_size,verbose)
model = tf.keras.Sequential()
model.add()
model.summary()
model.compile()
model.fit()
model.evaluate()
model.predict()
# 1 导入库
import tensorflow as tf
print("TensorFlow version: ", tf.__version__)
import numpy as np
import matplotlib.pyplot as plt
# 在使用GPU版本的Tensorflow训练模型时,有时候会遇到显存分配的错误
# InternalError: Bias GEMM launch failed
# 这是在调用GPU运行程序时,GPU的显存空间不足引起的,为了避免这个错误,可以对GPU的使用模式进行设置
gpus = tf.config.experimental.list_physical_devices('GPU')# 这是列出当前系统中的所有GPU,放在列表gpus中
# 使用第一块gpu,所以是gpus[0],把它设置为memory_growth模式,允许内存增长也就是说在程序运行过程中,根据需要为TensoFlow进程分配显存
# 如果系统中有多个GPU,可以使用循环语句把它们都设置成为true模式
tf.config.experimental.set_memory_growth(gpus[0], True)
# 2 加载数据
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
# (60000,28,28),(60000,),(10000,28,28),(10000,)
# numpy.ndarray,numpy.ndarray,numpy.ndarray,numpy.ndarray
# 3 数据预处理,这里也可以省去,在之后为进行维度变换
# X_train = train_x.reshape((60000,28*28)) # (60000,784)
# X_test = test_x.reshape((10000,28*28)) # (10000,784)
# 对属性进行归一化,使它的取值在0~1之间,同时转换为tensorflow张量,类型为tf.int16
X_train,X_test = tf.cast(train_x/255.0,tf.float32),tf.cast(test_x/255.0,tf.float32)
y_train,y_test = tf.cast(train_y,tf.int16),tf.cast(test_y,tf.int16)
# 4 建立模型
model = tf.keras.Sequential()
# 首先添加一个Flatten,说明输入层的形状,其不进行计算,只是完成形状转换,
# 把输入的属性拉直,变成一维数组,这样在数据预处理阶段,不用改变数据的形状,隐含层中也不用说明输入数据,各层结构更加清晰
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(128,activation="relu")) # 添加隐含层
model.add(tf.keras.layers.Dense(10,activation="softmax")) # 添加输出层
# model.summary()函数查看网络结构和信息
# 5 配置模型的训练方法
model.compile(optimizer = 'adam', # 优化器使用adam,这里不用设置其中的参数,因为keras中已经使用公开的参数作为默认值,大多数情况下,都可以得到好的结果
loss = 'sparse_categorical_crossentropy', # 损失函数使用稀疏交叉熵损失函数
metrics = ['sparse_categorical_accuracy']) # 标签值:0~9;预测值:概率分布,类似于独热编码;所以使用稀疏分类准确率函数
# 6 训练模型
# 从中划分出20%作为测试数据
model.fit(X_train,y_train,batch_size = 64,epochs=5,validation_split=0.2)
# 7 评估模型
# 在这里,使用mnist本身的测试集评估模型
model.evaluate(X_test,y_test,verbose=2)
# 8 使用模型
np.argmax(model.predict([[X_test[0]]]))# 两层中括号
# 随机抽取4个样本
for i in range(4):
num = np.random.randint(1,10000)
plt.subplot(1,4,i+1)
plt.axis("off")
plt.imshow(test_x[num],cmap='gray')
y_pred = np.argmax(model.predict([[X_test[num]]]))
plt.title("y="+str(test_y[num])+"\ny_pred"+str(y_pred))
plt.show()
输出结果为:
rain on 48000 samples, validate on 12000 samples
Epoch 1/5
2021-12-19 21:01:08.858052: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll
48000/48000 [==============================] - 3s 53us/sample - loss: 0.3291 - sparse_categorical_accuracy: 0.9077 - val_loss: 0.1822 - val_sparse_categorical_accuracy: 0.9500
Epoch 2/5
48000/48000 [==============================] - 2s 38us/sample - loss: 0.1520 - sparse_categorical_accuracy: 0.9557 - val_loss: 0.1402 - val_sparse_categorical_accuracy: 0.9592
Epoch 3/5
48000/48000 [==============================] - 2s 39us/sample - loss: 0.1061 - sparse_categorical_accuracy: 0.9693 - val_loss: 0.1183 - val_sparse_categorical_accuracy: 0.9656
Epoch 4/5
48000/48000 [==============================] - 2s 39us/sample - loss: 0.0805 - sparse_categorical_accuracy: 0.9766 - val_loss: 0.0995 - val_sparse_categorical_accuracy: 0.9709
Epoch 5/5
48000/48000 [==============================] - 2s 39us/sample - loss: 0.0643 - sparse_categorical_accuracy: 0.9812 - val_loss: 0.0950 - val_sparse_categorical_accuracy: 0.9711
model.save_weights(filepath,
overwrite = true,
save_format = None)
model.save_weights("mnist_weights",save_format="tf")
model.load_weight(filepath)
如果加载报错,就看这个keras调用model.load_weights()函数报错:AttributeError: ‘str‘ object has no attribute ‘decode‘
model.save_weight("mnist_weights.h5")
# 6 调用已经训练好的参数文件
model.load_weights("mnist_weights.h5")
model.evaluate(X_test,y_test,verbose=2)
# 1 导入库
import tensorflow as tf
print("TensorFlow version: ", tf.__version__)
import numpy as np
import matplotlib.pyplot as plt
# 在使用GPU版本的Tensorflow训练模型时,有时候会遇到显存分配的错误
# InternalError: Bias GEMM launch failed
# 这是在调用GPU运行程序时,GPU的显存空间不足引起的,为了避免这个错误,可以对GPU的使用模式进行设置
gpus = tf.config.experimental.list_physical_devices('GPU')# 这是列出当前系统中的所有GPU,放在列表gpus中
# 使用第一块gpu,所以是gpus[0],把它设置为memory_growth模式,允许内存增长也就是说在程序运行过程中,根据需要为TensoFlow进程分配显存
# 如果系统中有多个GPU,可以使用循环语句把它们都设置成为true模式
tf.config.experimental.set_memory_growth(gpus[0], True)
# 2 加载数据
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
# (60000,28,28),(60000,),(10000,28,28),(10000,)
# numpy.ndarray,numpy.ndarray,numpy.ndarray,numpy.ndarray
# 3 数据预处理,这里也可以省去,在之后为进行维度变换
# X_train = train_x.reshape((60000,28*28)) # (60000,784)
# X_test = test_x.reshape((10000,28*28)) # (10000,784)
# 对属性进行归一化,使它的取值在0~1之间,同时转换为tensorflow张量,类型为tf.int16
X_train,X_test = tf.cast(train_x/255.0,tf.float32),tf.cast(test_x/255.0,tf.float32)
y_train,y_test = tf.cast(train_y,tf.int16),tf.cast(test_y,tf.int16)
# 4 建立模型
model = tf.keras.Sequential()
# 首先添加一个Flatten,说明输入层的形状,其不进行计算,只是完成形状转换,
# 把输入的属性拉直,变成一维数组,这样在数据预处理阶段,不用改变数据的形状,隐含层中也不用说明输入数据,各层结构更加清晰
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(128,activation="relu")) # 添加隐含层
model.add(tf.keras.layers.Dense(10,activation="softmax")) # 添加输出层
# model.summary()函数查看网络结构和信息
# 5 配置模型的训练方法
model.compile(optimizer = 'adam', # 优化器使用adam,这里不用设置其中的参数,因为keras中已经使用公开的参数作为默认值,大多数情况下,都可以得到好的结果
loss = 'sparse_categorical_crossentropy', # 损失函数使用稀疏交叉熵损失函数
metrics = ['sparse_categorical_accuracy']) # 标签值:0~9;预测值:概率分布,类似于独热编码;所以使用稀疏分类准确率函数
# 6 调用已经训练好的参数文件
model.load_weights("mnist_weights.h5")
model.evaluate(X_test,y_test,verbose=2)
# 8 使用模型
np.argmax(model.predict([[X_test[0]]]))# 两层中括号
# 随机抽取4个样本
for i in range(4):
num = np.random.randint(1,10000)
plt.subplot(1,4,i+1)
plt.axis("off")
plt.imshow(test_x[num],cmap='gray')
y_pred = np.argmax(model.predict([[X_test[num]]]))
plt.title("y="+str(test_y[num])+"\ny_pred"+str(y_pred))
plt.show()
model.load_weights()
仅仅是替代了model.fit()
,不用重新替代模型model.save(filepath,
overwrite=True,
include_optimizer=True,
save_format=None
)
tf.keras.models.load_model()
model.save("mnist_model_all.h5")
# 1 导入库
import tensorflow as tf
print("TensorFlow version: ", tf.__version__)
import numpy as np
import matplotlib.pyplot as plt
# 在使用GPU版本的Tensorflow训练模型时,有时候会遇到显存分配的错误
# InternalError: Bias GEMM launch failed
# 这是在调用GPU运行程序时,GPU的显存空间不足引起的,为了避免这个错误,可以对GPU的使用模式进行设置
gpus = tf.config.experimental.list_physical_devices('GPU')# 这是列出当前系统中的所有GPU,放在列表gpus中
# 使用第一块gpu,所以是gpus[0],把它设置为memory_growth模式,允许内存增长也就是说在程序运行过程中,根据需要为TensoFlow进程分配显存
# 如果系统中有多个GPU,可以使用循环语句把它们都设置成为true模式
tf.config.experimental.set_memory_growth(gpus[0], True)
# 2 加载数据
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
# (60000,28,28),(60000,),(10000,28,28),(10000,)
# numpy.ndarray,numpy.ndarray,numpy.ndarray,numpy.ndarray
# 3 数据预处理,这里也可以省去,在之后为进行维度变换
# X_train = train_x.reshape((60000,28*28)) # (60000,784)
# X_test = test_x.reshape((10000,28*28)) # (10000,784)
# 对属性进行归一化,使它的取值在0~1之间,同时转换为tensorflow张量,类型为tf.int16
X_train,X_test = tf.cast(train_x/255.0,tf.float32),tf.cast(test_x/255.0,tf.float32)
y_train,y_test = tf.cast(train_y,tf.int16),tf.cast(test_y,tf.int16)
# 6 调用已经训练好的参数文件
model = tf.keras.models.load_model("mnist_model_all.h5")
model.evaluate(X_test,y_test,verbose=2)
# 8 使用模型
np.argmax(model.predict([[X_test[0]]]))# 两层中括号
# 随机抽取4个样本
for i in range(4):
num = np.random.randint(1,10000)
plt.subplot(1,4,i+1)
plt.axis("off")
plt.imshow(test_x[num],cmap='gray')
y_pred = np.argmax(model.predict([[X_test[num]]]))
plt.title("y="+str(test_y[num])+"\ny_pred"+str(y_pred))
plt.show()
即可