Qwen3-VL调用C#进行FTP文件传输管理
2026/1/3 4:35:36
python 3.9.2 tensorflow 2.10.0 Jupyter Notebook: 7.4.5# 打印当前时间importdatetimeprint(datetime.datetime.now())# 配置gpuimporttensorflowastf gpus=tf.config.list_physical_devices("GPU")ifgpus:gpu0=gpus[0]tf.config.experimental.set_memory_growth(gpu0,True)# 设置gpu现存用量按需使用tf.config.set_visible_devices([gpu0],"GPU")print(gpus)# 数据导入importtensorflowastffromtensorflow.kerasimportdatasets,layers,modelsimportmatplotlib.pyplotasplt# 导入mnist数据,依次分别为训练集图片、训练集标签、测试集图片、测试集标签(train_images,train_labels),(test_images,test_labels)=datasets.mnist.load_data()# 将像素的值标准化至0到1的区间内。(对于灰度图片来说,每个像素最大值是255,每个像素最小值是0,也就是直接除以255就可以完成归一化。) 这样做可以加速模型的收敛速度,因为大部分神经网络激活函数(如ReLU)在输入值较小时表现更好。train_images,test_images=train_images/255.0,test_images/255.0# 查看数据维数信息train_images.shape,test_images.shape,train_labels.shape,test_labels.shape# 将数据集前20个图片数据可视化显示# 进行图像大小为20宽、10长的绘图(单位为英寸inch)plt.figure(figsize=(20,10))# 遍历MNIST数据集下标数值0~19foriinrange(20):# 将整个figure分成2行10列,绘制第i+1个子图。plt.subplot(2,10,i+1)# 设置不显示x轴刻度plt.xticks([])# 设置不显示y轴刻度plt.yticks([])# 设置不显示子图网格线plt.grid(False)# 图像展示,cmap为颜色图谱,"plt.cm.binary"为matplotlib.cm中的色表plt.imshow(train_images[i],cmap=plt.cm.binary)# 设置x轴标签显示为图片对应的数字plt.xlabel(train_labels[i])# 显示图片plt.show()#调整数据到我们需要的格式,分别对应样本数、高度、宽度、颜色通道数train_images=train_images.reshape((60000,28,28,1))test_images=test_images.reshape((10000,28,28,1))train_images.shape,test_images.shape,train_labels.shape,test_labels.shapelayers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))的input_shape参数。它定义了模型期望接收的数据格式,这里是(28, 28, 1),代表高度28像素、宽度28像素、1个颜色通道(灰度图)的图像。它本身不进行任何计算,只是规定了数据进入模型的“接口”形状。32/64: 表示该层包含的卷积核(滤波器)的数量。数量越多,模型能学习到的特征模式就越多。(3, 3): 表示卷积核的尺寸,这里是3x3的窗口。activation='relu': 应用ReLU激活函数,引入非线性,使得网络能够学习更复杂的模式。ReLU函数(f(x) = max(0, x))还能缓解梯度消失问题,加速训练。(2, 2): 表示池化窗口的大小是2x2。这个窗口会滑过输入特征图,每次移动2个像素(步长通常等于窗口大小),并应用聚合操作(这里是最大值)。(batch_size, height, width, channels)形状)压平成一维向量(形状变为(batch_size, height * width * channels))。layers.Dense(64, activation='relu')起到了“特征提取器”和“分类器”的双重作用。在靠近输出的部分,它更像是一个分类器。64: 表示该层神经元的数量。这决定了该层输出特征向量的维度。activation='relu': 再次应用ReLU激活函数,引入非线性。10: 表示输出空间的维度,对应MNIST数据集的10个数字类别(0-9)。模型会为输入图像计算出一个10维的输出向量,通常这个向量中数值最大的那个索引就代表模型预测的类别。# 构建模型model=models.Sequential([# 设置二维卷积层1,设置32个3*3卷积核,activation参数将激活函数设置为ReLu函数,input_shape参数将图层的输入形状设置为(28, 28, 1)# ReLu函数作为激活励函数可以增强判定函数和整个神经网络的非线性特性,而本身并不会改变卷积层# 相比其它函数来说,ReLU函数更受青睐,这是因为它可以将神经网络的训练速度提升数倍,而并不会对模型的泛化准确度造成显著影响。layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)),#池化层1,2*2采样layers.MaxPooling2D((2,2)),# 设置二维卷积层2,设置64个3*3卷积核,activation参数将激活函数设置为ReLu函数layers.Conv2D(64,(3,3),activation='relu'),#池化层2,2*2采样layers.MaxPooling2D((2,2)),layers.Flatten(),#Flatten层,连接卷积层与全连接层layers.Dense(64,activation='relu'),#全连接层,特征进一步提取,64为输出空间的维数,activation参数将激活函数设置为ReLu函数layers.Dense(10)#输出层,输出预期结果,10为输出空间的维数])# 打印网络结构model.summary()""" 这里设置优化器、损失函数以及metrics """# model.compile()方法用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准model.compile(# 设置优化器为Adam优化器optimizer='adam',# 设置损失函数为交叉熵损失函数(tf.keras.losses.SparseCategoricalCrossentropy())# from_logits为True时,会将y_pred转化为概率(用softmax),否则不进行转换,通常情况下用True结果更稳定loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),# 设置性能指标列表,将在模型训练时监控列表中的指标metrics=['accuracy'])""" 这里设置输入训练数据集(图片及标签)、验证数据集(图片及标签)以及迭代次数epochs 关于model.fit()函数的具体介绍可参考我的博客: https://blog.csdn.net/qq_38251616/article/details/122321757 """history=model.fit(# 输入训练集图片train_images,# 输入训练集标签train_labels,# 设置10个epoch,每一个epoch都将会把所有的数据输入模型完成一次训练。epochs=10,# 设置验证集validation_data=(test_images,test_labels))plt.imshow(test_images[1])pre=model.predict(test_images)# 对所有测试图片进行预测pre[1]# 输出第一张图片的预测结果datasets.mnist.load_data)、数据预处理(归一化、reshape)、模型构建(Sequential模型和layers模块)、模型编译(model.compile)到模型训练(model.fit)和预测(model.predict)的整个深度学习流程都变得结构化和易于实现。特别是集成的Keras(tf.keras)API,极大地简化了模型搭建的复杂度,相比于PyTorch框架,在快速模型构建方面变得更方便了。