深度学习(二)
4.前馈全连接神经网络(Sequential模型)
import tensorflow as tf
from tensorflow import keras
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[784]),
keras.layers.Dense(300,activation="relu"),
keras.layers.Dense(100,activation="relu"),
keras.layers.Dense(10,activation="softmax")
])
使用TensorFlow和Keras库来创建一个简单的神经网络模型,用于分类MNIST数据集中的手写数字。
import tensorflow as tf:导入TensorFlow库,这是一个流行的开源机器学习库,用于构建和训练各种类型的神经网络。
from tensorflow import keras:从TensorFlow库中导入Keras API。Keras是一个高级神经网络API,它能够以TensorFlow作为后端运行,提供了一种更简洁、更模块化的方式来构建和训练神经网络。
model = keras.models.Sequential():创建一个Keras的顺序模型(Sequential model)。顺序模型是Keras中最常见的模型类型,它允许我们逐层堆叠各个层来构建模型。
keras.layers.Flatten(input_shape=[784]):向模型中添加一个展平层(Flatten layer),它的作用是将输入的数据展平成一个一维数组。由于MNIST图像的原始大小是28x28像素,所以展平后的数组长度为784。
keras.layers.Dense(300, activation="relu"):添加一个全连接层(Dense layer),它有300个神经元,并使用ReLU(Rectified Linear Unit)作为激活函数。ReLU激活函数在输入为正时输出与输入相同,在输入为负时输出0。
keras.layers.Dense(100, activation="relu"):再添加一个全连接层,它有100个神经元,同样使用ReLU激活函数。
keras.layers.Dense(10, activation="softmax"):最后添加一个全连接层,它有10个神经元,每个神经元对应一个数字类别(0到9)。这个层使用softmax激活函数,它将神经元的输出转换为概率分布,表示每个类别的预测概率。
model.layers[1]
在TensorFlow Keras模型中,model.layers属性是一个列表,包含了模型中的所有层。列表中的每个元素都是一个层对象,它们按照模型构建时的顺序排列。
当你使用model.layers[1]时,你正在访问列表中的第二个元素,即模型的第二个层。根据之前定义的模型结构,第二个层是一个全连接层(Dense layer),它有300个神经元,并使用ReLU激活函数。
这个层的具体配置可以在model.layers[1].get_config()中找到,这将返回一个包含层配置的字典。例如,它将包含层的名称、激活函数、单元数等信息。
weights_1, bias_1 = model.layers[1].get_weights()
print(weights_1.shape)
print(bias_1.shape)
提取模型中第二个层的权重和偏置,并打印它们的形状。
weights_1, bias_1 = model.layers[1].get_weights():这行代码调用了get_weights()方法,它返回一个列表,其中包含了层的权重和偏置。在这个例子中,weights_1将包含第二个层的权重,而bias_1将包含偏置。
print(weights_1.shape):这行代码打印权重数组的形状。在这个模型中,第二个层是一个全连接层,它的输入维度是784(因为MNIST图像被展平成784个像素),输出维度是300(因为该层有300个神经元)。因此,权重的形状将是(784, 300)。
print(bias_1.shape):这行代码打印偏置数组的形状。在这个模型中,第二个层有300个神经元,因此偏置的形状将是(300,),即一个长度为300的一维数组。
model.summary()
打印出模型的概况,包括每一层的类型、输出形状、层的参数数量以及整个模型的总参数数量。
在一个已经构建好的Keras模型上调用model.summary()时,它会输出以下信息:
- 每层的类型(例如,Flatten、Dense)。
- 每层的输出形状。对于全连接层,输出形状是(批量大小, 单元数)。对于展平层,输出形状是(批量大小, 展平后的特征数)。
- 每层的参数数量。对于全连接层,参数数量是(输入特征数 * 单元数) + 单元数(因为还要加上偏置项)。
- 整个模型的总参数数量。
在这个输出中:
- None表示批量大小是未知的,可以是任意的。
- flatten层没有参数,因为它只是将输入展平。
- 第一个dense层有235,500个参数,计算方式是784(输入特征数)* 300(单元数)+ 300(偏置项)。
- 第二个dense层有30,100个参数,计算方式是300(输入特征数)* 100(单元数)+ 100(偏置项)。
- 第三个dense层有1,010个参数,计算方式是100(输入特征数)* 10(单元数)+ 10(偏置项)。
- 整个模型总共有266,610个参数,这些参数都是可训练的。
# 编译网络
model.compile(loss="sparse_categorical_crossentropy",optimizer="sgd",metrics=["accuracy"])
编译了Keras模型,指定了损失函数、优化器和评估指标。编译后的模型就可以使用model.fit()方法进行训练,使用model.evaluate()方法进行评估,以及使用model.predict()方法进行预测。
loss="sparse_categorical_crossentropy":这指定了模型的损失函数为稀疏分类交叉熵(sparse categorical crossentropy)。这个损失函数适用于多分类问题,其中每个样本只有一个真实的标签,并且标签是以整数形式给出的(例如,0到9)。在MNIST数据集中,每个图像都标记有一个0到9之间的数字,因此这个损失函数是合适的。
optimizer="sgd":这指定了模型的优化器为随机梯度下降(Stochastic Gradient Descent,SGD)。优化器负责在训练过程中更新模型的权重,以最小化损失函数。SGD是一种简单的优化算法,但它可能需要更多的时间来训练模型,并且可能需要仔细调整学习率和其他超参数。
metrics=["accuracy"]:这指定了模型在训练和评估过程中要监控的指标。在这里,你选择了准确率(accuracy)作为评估模型性能的主要指标。准确率是指模型正确预测的样本数与总样本数之间的比例。
# 训练网络
h = model.fit(X_train, y_train, batch_size=32, epochs=30,validation_data=(X_valid, y_valid))
使用Keras模型的fit方法来训练之前编译的模型。fit方法负责执行实际的训练过程,在每个训练周期(epoch)中多次迭代训练数据,并更新模型的权重。
X_train, y_train:这些是训练数据的特征和标签。X_train包含了模型的输入数据,而y_train包含了对应的真实标签。
batch_size=32:这是每次梯度更新中使用的样本数量。批量大小(batch size)是一个重要的超参数,它影响了模型训练的稳定性和速度。在这个例子中,每个批量包含32个样本。
epochs=30:这是训练过程中遍历整个训练数据集的次数。每个周期(epoch)中,模型会看到一次所有的训练样本。在这个例子中,模型将进行30次这样的遍历。
validation_data=(X_valid, y_valid):这是验证数据集的特征和标签。在每次训练周期结束后,模型将使用这个数据集来评估当前模型的性能。这有助于监控训练过程,防止过拟合,并调整模型或训练参数。
h = model.fit:方法的返回值是一个历史对象(History object),它包含了训练过程中的损失值和评估指标值。这个对象可以用来分析训练过程中的性能变化,例如,通过绘制损失和准确率随时间的变化图。
总结:使用训练数据集X_train和y_train来训练模型,每个周期遍历整个数据集30次,每次使用32个样本的批量大小。同时,使用验证数据集X_valid和y_valid来监控训练过程中的模型性能。训练完成后,可以通过h对象来分析训练历史。
pd.DataFrame(h.history)
在Keras中,当使用model.fit()方法训练模型时,可以返回一个历史对象(History object),它记录了训练过程中的损失值和评估指标值。这个历史对象有一个history属性,它是一个字典,包含了训练过程中每个周期(epoch)的损失和评估指标。
pd.DataFrame(h.history)这行代码的作用是将历史对象的history属性转换为一个pandas的DataFrame对象。这样做的目的是为了更方便地查看和分析训练过程中的数据。
DataFrame是一个二维标签化数据结构,它提供了许多灵活的操作和数据分析工具。通过将历史数据转换为DataFrame,你可以轻松地执行以下操作:
- 查看每个周期结束时模型的损失和评估指标。
- 绘制损失和评估指标随时间的变化图。
- 计算损失和评估指标的平均值、标准差等统计信息。
- 将数据导出为CSV文件或其他格式。
在这个DataFrame中,每一行代表一个训练周期,列包括训练损失(loss)、训练准确率(accuracy)、验证损失(val_loss)和验证准确率(val_accuracy)。通过这个DataFrame,可以直观地看到模型在每个周期中的性能变化。
# 绘图
pd.DataFrame(h.history).plot(figsize=(8,5))
plt.grid(True)
plt.gca().set_ylim(0, 1) # set the vertical range to[0 - 1]
plt.show()
使用pandas和matplotlib库来绘制模型训练过程中的损失和评估指标的变化图。
pd.DataFrame(h.history).plot(figsize=(8,5)):首先,将历史对象的history属性转换为pandas的DataFrame对象,然后调用DataFrame的plot方法来绘制图表。figsize=(8,5)参数设置了图表的大小,宽为8英寸,高为5英寸。
plt.grid(True):这行代码为图表添加网格线,以便更容易地读取数据点的值。
plt.gca().set_ylim(0, 1):这行代码设置了图表的垂直范围。由于损失值和准确率通常在0到1之间,因此将垂直范围设置为[0, 1]可以更清楚地展示这些数据。
plt.show():最后,调用plt.show()来显示图表。这将在一个新的窗口中显示包含损失和准确率变化图的图表。
将模型训练过程中的损失和评估指标(如准确率)以图表的形式展示出来,这有助于分析和理解模型的训练效果。通过观察这些指标随时间的变化,可以判断模型是否收敛,是否出现过拟合,以及是否需要调整训练参数。
# 对测试集验证训练模型手写识别准确率
model.evaluate(X_test, y_test,batch_size = 1)
用Keras模型的evaluate方法来对测试集进行评估,以计算模型在测试数据上的损失和评估指标。
model.evaluate():这个方法会返回一个包含损失值和评估指标值的列表。对于分类问题,通常返回的指标包括损失函数的值和准确率。在这个例子中,由于模型在编译时指定了metrics=["accuracy"],evaluate方法将返回测试集上的损失率和准确率。
x_sample,y_sample=X_test[11:12],y_test[11]
y_prob=model.predict(x_sample).round(2)
y_prob
对测试集中的单个样本进行预测,并查看模型预测的概率分布。
x_sample, y_sample = X_test[11:12], y_test[11]:这行代码从测试集中提取第12个样本(索引为11,因为索引从0开始)的特征和标签。x_sample包含了这个样本的图像数据,而y_sample是这个样本的真实标签。
y_prob = model.predict(x_sample).round(2):这行代码使用模型的predict方法来预测x_sample的概率分布。predict方法返回一个数组,其中每个元素是模型预测的对应类别的概率。round(2)函数将预测的概率四舍五入到小数点后两位,以便于阅读。
y_prob:这个变量包含了模型对x_sample的预测概率。由于MNIST数据集有10个类别(数字0到9),y_prob将是一个长度为10的数组,每个元素对应一个类别的预测概率。
img = x_sample.reshape(28,28)
plt.imshow(img)#画图
plt.title('label =' + str(np.argmax(y_prob)))
plt.show()
显示测试集中一个样本的图像,并使用模型预测的标签作为标题。
img = x_sample.reshape(28,28):这行代码将单个样本的特征数据x_sample重新整形为一个28x28的二维数组,这样就可以将其视为一个图像。由于MNIST图像的原始大小是28x28像素,这个重塑操作将一维数组转换成二维的图像格式。
plt.imshow(img):这行代码使用matplotlib的imshow函数来显示图像。imshow函数可以显示二维数组作为图像。
plt.title('label = ' + str(np.argmax(y_prob))):这行代码设置图像的标题。np.argmax(y_prob)返回概率数组y_prob中最大值的索引,这个索引代表了模型预测的类别。标题显示了字符串"label = "后跟这个预测的类别。
plt.show():这行代码显示图像。图像将在一个新的窗口中显示,标题为模型预测的标签。
显示了测试集中一个样本的图像,并使用模型预测的标签作为图像的标题。这有助于直观地验证模型的预测结果是否正确。如果模型的预测标签与图像的真实标签相同,则说明模型正确地识别了图像。如果不同,则说明模型在识别这个特定图像时犯了错误
标签:layers,sample,plt,训练,模型,学习,深度,model From: https://blog.csdn.net/2303_77556681/article/details/139334921