【tensorflow速成】Tensorflow图像分类从模型自定义到测试

《TensorFlow深度学习应用实践》速成笔记与学习心得 因急于从零开始做一个项目,不求甚解边看边记一下这本书里可用的内容。 第1章 星星之火 讲的是计算机视觉的起源和深度学习的基本概念之类的,没啥好看的 第2章 Python的安装与使用 怎么装Python和pycharm,网上资料很多。突然讲threading类,目前没明白是啥。 第3章 深度学习的理论基础----机器学习 机器学习的分类 可以按学科、学习模式、应用领域分 机器学习的基本算法 讲得很详... 阅读详情

文章首发于微信公众号《与有三学AI》

【tensorflow速成】Tensorflow图像分类从模型自定义到测试

这是给大家准备的tensorflow速成例子

上一篇介绍了 Caffe ,这篇将介绍 TensorFlow。

 

01 什么是 TensorFlow

TensorFlow 是 Google brain 推出的开源机器学习库,与 Caffe 一样,主要用作深度学习相关的任务。

与 Caffe 相比 TensorFlow 的安装简单很多,一条 pip 命令就可以解决,新手也不会误入各种坑。

TensorFlow = Tensor + Flow

Tensor 就是张量,代表 N 维数组,与 Caffe 中的 blob 是类似的;Flow 即流,代表基于数据流图的计算。神经网络的运算过程,就是数据从一层流动到下一层,在 Caffe 的每一个中间 layer 参数中,都有 bottom 和 top,这就是一个分析和处理的过程。TensorFlow更直接强调了这个过程。

TensorFlow 最大的特点是计算图,即先定义好图,然后进行运算,所以所有的TensorFlow 代码,都包含两部分:

(1)创建计算图,表示计算的数据流。它做了什么呢?实际上就是定义好了一些操作,你可以将它看做是 Caffe 中的 prototxt 的定义过程。

(2)运行会话,执行图中的运算,可以看作是 Caffe 中的训练过程。只是TensorFlow的会话比 Caffe 灵活很多,由于是 Python 接口,取中间结果分析,Debug 等方便很多。

 

02 TensorFlow 训练

咱们这是实战速成,没有这么多时间去把所有事情细节都说清楚,而是抓住主要脉络。有了 TensorFlow 这个工具后,我们接下来的任务就是开始训练模型。训练模型,包括数据准备、模型定义、结果保存与分析。

2.1数据准备

上一节我们说过 Caffe 中的数据准备,只需要准备一个 list 文件,其中每一行存储 image、labelid 就可以了,那是 Caffe 默认的分类网络的 imagedata 层的输入格式。如果想定义自己的输入格式,可以去新建自定义的 Data Layer,而 Caffe 官方的 data layer 和 imagedata layer 都非常稳定,几乎没有变过,这是我更欣赏 Caffe 的一个原因。因为输入数据,简单即可。相比之下,TensorFlow 中的数据输入接口就要复杂很多,更新也非常快,我知乎有一篇文章,说过从《从 Caffe 到 TensorFlow 1,IO 操作》,有兴趣的读者可以了解一下。

这里我们不再说 TensorFlow 中有多少种数据 IO 方法,先确定好我们的数据格式,那就是跟 Caffe一样,准备好一个list,它的格式一样是 image、labelid,然后再看如何将数据读入 TensorFlow 进行训练。

我们定义一个类,叫 imagedata,模仿 Caffe 中的使用方式。代码如下,源代码可移步 Git。

import tensorflow as tf

from tensorflow.contrib.data import Dataset

from tensorflow.python.framework import dtypes

from tensorflow.python.framework.ops import convert_to_tensor

import numpy as np

class ImageData:

        def read_txt_file(self):

            self.img_paths = []

            self.labels = []

            for line in open(self.txt_file, 'r'):

                items = line.split(' ')

                self.img_paths.append(items[0])

                self.labels.append(int(items[1]))

        def __init__(self, txt_file, batch_size, num_classes,

                     image_size,buffer_scale=100):

            self.image_size = image_size

            self.batch_size = batch_size

            self.txt_file = txt_file ##txt list file,stored as: imagename id

            self.num_classes = num_classes

            buffer_size = batch_size * buffer_scale

 

        # 读取图片

        self.read_txt_file()

        self.dataset_size = len(self.labels) 

        print "num of train datas=",self.dataset_size

        # 转换成Tensor

        self.img_paths = convert_to_tensor(self.img_paths, dtype=dtypes.string)

        self.labels = convert_to_tensor(self.labels, dtype=dtypes.int32)

 

        # 创建数据集

        data = Dataset.from_tensor_slices((self.img_paths, self.labels))

        print "data type=",type(data)

        data = data.map(self.parse_function)

        data = data.repeat(1000)

        data = data.shuffle(buffer_size=buffer_size)

 

        # 设置self data Batch

        self.data = data.batch(batch_size)

        print "self.data type=",type(self.data)

 

        def augment_dataset(self,image,size):

            distorted_image = tf.image.random_brightness(image,

                                               max_delta=63)

            distorted_image = tf.image.random_contrast(distorted_image,

                                             lower=0.2, upper=1.8)

            # Subtract off the mean and divide by the variance of the pixels.

            float_image = tf.image.per_image_standardization(distorted_image)

            return float_image

 

        def parse_function(self, filename, label):

            label_ = tf.one_hot(label, self.num_classes)

            img = tf.read_file(filename)

            img = tf.image.decode_jpeg(img, channels=3)

            img = tf.image.convert_image_dtype(img, dtype = tf.float32)

            img = tf.random_crop(img,[self.image_size[0],self.image_size[1],3])

            img = tf.image.random_flip_left_right(img)

            img = self.augment_dataset(img,self.image_size)

            return img, label_

下面来分析上面的代码,类是 ImageData,它包含几个函数,__init__构造函数,read_txt_file数据读取函数,parse_function数据预处理函数,augment_dataset数据增强函数。

我们直接看构造函数吧,分为几个步骤:

(1)读取变量,文本 list 文件txt_file,批处理大小batch_size,类别数num_classes,要处理成的图片大小image_size,一个内存变量buffer_scale=100。

(2)在获取完这些值之后,就到了read_txt_file函数。代码很简单,就是利用self.img_paths和 self.labels存储输入 txt 中的文件列表和对应的 label,这一点和 Caffe 很像了。

(3)然后,就是分别将img_paths和 labels 转换为 Tensor,函数是convert_to_tensor,这是 Tensor 内部的数据结构。

(4)创建 dataset,Dataset.from_tensor_slices,这一步,是为了将 img 和 label 合并到一个数据格式,此后我们将利用它的接口,来循环读取数据做训练。当然,创建好 dataset 之后,我们需要给它赋值才能真正的有数据。data.map 就是数据的预处理,包括读取图片、转换格式、随机旋转等操作,可以在这里做。

data = data.repeat(1000) 是将数据复制 1000 份,这可以满足我们训练 1000 个 epochs。data = data.shuffle(buffer_size=buffer_size)就是数据 shuffle 了,buffer_size就是在做 shuffle 操作时的控制变量,内存越大,就可以用越大的值。

(5)给 selft.data 赋值,我们每次训练的时候,是取一个 batchsize 的数据,所以 self.data = data.batch(batch_size),就是从上面创建的 dataset 中,一次取一个 batch 的数据。

到此,数据接口就定义完毕了,接下来在训练代码中看如何使用迭代器进行数据读取就可以了。

关于更多 TensorFlow 的数据读取方法,请移步知乎专栏和公众号。

2.2 模型定义

创建数据接口后,我们开始定义一个网络。

def simpleconv3net(x):

        x_shape = tf.shape(x)

        with tf.variable_scope("conv3_net"):

            conv1 = tf.layers.conv2d(x, name="conv1", filters=12,kernel_size=[3,3], strides=(2,2), activation=tf.nn.relu,kernel_initializer=tf.contrib.layers.xavier_initializer(),bias_initializer=tf.contrib.layers.xavier_initializer())

            bn1 = tf.layers.batch_normalization(conv1, training=True, name='bn1')

            conv2 = tf.layers.conv2d(bn1, name="conv2", filters=24,kernel_size=[3,3], strides=(2,2), activation=tf.nn.relu,kernel_initializer=tf.contrib.layers.xavier_initializer(),bias_initializer=tf.contrib.layers.xavier_initializer())

            bn2 = tf.layers.batch_normalization(conv2, training=True, name='bn2')

            conv3 = tf.layers.conv2d(bn2, name="conv3", filters=48,kernel_size=[3,3], strides=(2,2), activation=tf.nn.relu,kernel_initializer=tf.contrib.layers.xavier_initializer(),bias_initializer=tf.contrib.layers.xavier_initializer())

            bn3 = tf.layers.batch_normalization(conv3, training=True, name='bn3')

            conv3_flat = tf.reshape(bn3, [-1, 5 * 5 * 48])

            dense = tf.layers.dense(inputs=conv3_flat, units=128, activation=tf.nn.relu,name="dense",kernel_initializer=tf.contrib.layers.xavier_initializer())

            logits= tf.layers.dense(inputs=dense, units=2, activation=tf.nn.relu,name="logits",kernel_initializer=tf.contrib.layers.xavier_initializer())

            if debug:

                print "x size=",x.shape

                print "relu_conv1 size=",conv1.shape

                print "relu_conv2 size=",conv2.shape

                print "relu_conv3 size=",conv3.shape

                print "dense size=",dense.shape

                print "logits size=",logits.shape

 

        return logits

上面就是我们定义的网络,是一个简单的3层卷积。在 tf.layers 下,有各种网络层,这里就用到了 tf.layers.conv2d,tf.layers.batch_normalization和 tf.layers.dense,分别是卷积层,BN 层和全连接层。我们以一个卷积层为例:

conv1 = tf.layers.conv2d(x, name="conv1", filters=12,kernel_size=[3,3], strides=(2,2), activation=tf.nn.relu,kernel_initializer=tf.contrib.layers.xavier_initializer(),bias_initializer=tf.contrib.layers.xavier_initializer())

x 即输入,name 是网络名字,filters 是卷积核数量,kernel_size即卷积核大小,strides 是卷积 stride,activation 即激活函数,kernel_initializer和bias_initializer分别是初始化方法。可见已经将激活函数整合进了卷积层,更全面的参数,请自查 API。其实网络的定义,还有其他接口,tf.nn、tf.layers、tf.contrib,各自重复,在我看来有些混乱。这里之所以用 tf.layers,就是因为参数丰富,适合从头训练一个模型。

2.3 模型训练

老规矩,我们直接上代码,其实很简单。

from dataset import *
from net import simpleconv3net
import sys
import os
import cv2

////-------1 定义一些全局变量-------////

txtfile = sys.argv[1]
batch_size = 64
num_classes = 2
image_size = (48,48)
learning_rate = 0.0001

debug=False

if __name__=="__main__":

////-------2 载入网络结构,定义损失函数,创建计算图-------////

   dataset = ImageData(txtfile,batch_size,num_classes,image_size)
   iterator = dataset.data.make_one_shot_iterator()
   dataset_size = dataset.dataset_size
   batch_images,batch_labels = iterator.get_next()
   Ylogits = simpleconv3net(batch_images)

   print "Ylogits size=",Ylogits.shape

   Y = tf.nn.softmax(Ylogits)
   cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Ylogits, labels=batch_labels)
   cross_entropy = tf.reduce_mean(cross_entropy)
   correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(batch_labels, 1))
   accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
   update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
   with tf.control_dependencies(update_ops):
       train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

   saver = tf.train.Saver()
   in_steps = 100
   checkpoint_dir = 'checkpoints/'
   if not os.path.exists(checkpoint_dir):
       os.mkdir(checkpoint_dir)
   log_dir = 'logs/'
   if not os.path.exists(log_dir):
       os.mkdir(log_dir)
   summary = tf.summary.FileWriter(logdir=log_dir)
   loss_summary = tf.summary.scalar("loss", cross_entropy)
   acc_summary = tf.summary.scalar("acc", accuracy)
   image_summary = tf.summary.image("image", batch_images)
////-------3 执行会话,保存相关变量,还可以添加一些debug函数来查看中间结果-------////

 with tf.Session() as sess:  
       init = tf.global_variables_initializer()
       sess.run(init)  
       steps = 10000  
       for i in range(steps): 
           _,cross_entropy_,accuracy_,batch_images_,batch_labels_,loss_summary_,acc_summary_,image_summary_ = sess.run([train_step,cross_entropy,accuracy,batch_images,batch_labels,loss_summary,acc_summary,image_summary])
           if i % in_steps == 0 :
               print i,"iterations,loss=",cross_entropy_,"acc=",accuracy_
               saver.save(sess, checkpoint_dir + 'model.ckpt', global_step=i)    
               summary.add_summary(loss_summary_, i)
               summary.add_summary(acc_summary_, i)
               summary.add_summary(image_summary_, i)
               #print "predict=",Ylogits," labels=",batch_labels

               if debug:
                   imagedebug = batch_images_[0].copy()
                   imagedebug = np.squeeze(imagedebug)
                   print imagedebug,imagedebug.shape
                   print np.max(imagedebug)
                   imagelabel = batch_labels_[0].copy()
                   print np.squeeze(imagelabel)

                   imagedebug = cv2.cvtColor((imagedebug*255).astype(np.uint8),cv2.COLOR_RGB2BGR)
                   cv2.namedWindow("debug image",0)
                   cv2.imshow("debug image",imagedebug)
                   k = cv2.waitKey(0)
                   if k == ord('q'):
                       break

2.4 可视化

TensorFlow 很方便的一点,就是 Tensorboard 可视化。Tensorboard 的具体原理就不细说了,很简单,就是三步。

第一步,创建日志目录。

 log_dir = 'logs/'   

 if not os.path.exists(log_dir):        os.mkdir(log_dir)

第二步,创建 summary 操作并分配标签,如我们要记录 loss、acc 和迭代中的图片,则创建了下面的变量:

loss_summary = tf.summary.scalar("loss", cross_entropy)acc_summary = tf.summary.scalar("acc", accuracy)image_summary = tf.summary.image("image", batch_images)

第三步,session 中记录结果,如下面代码:

_,cross_entropy_,accuracy_,batch_images_,batch_labels_,loss_summary_,acc_summary_,image_summary_ = sess.run([train_step,cross_entropy,accuracy,batch_images,batch_labels,loss_summary,acc_summary,image_summary])

查看训练过程和最终结果时使用:

tensorboard --logdir=logs

Loss 和 acc 的曲线图如下:

 

 

03 TensorFlow 测试

上面已经训练好了模型,我们接下来的目标,就是要用它来做 inference 了。同样给出代码。

import tensorflow as tf
from net import simpleconv3net
import sys
import numpy as np
import cv2
import os

testsize = 48
x = tf.placeholder(tf.float32, [1,testsize,testsize,3])
y = simpleconv3net(x)
y = tf.nn.softmax(y)

lines = open(sys.argv[2]).readlines()
count = 0
acc = 0
posacc = 0
negacc = 0
poscount = 0
negcount = 0

with tf.Session() as sess:  
   init = tf.global_variables_initializer()
   sess.run(init)  
   saver = tf.train.Saver()
   saver.restore(sess,sys.argv[1])
   
   #test one by one, you can change it into batch inputs
   for line in lines:
       imagename,label = line.strip().split(' ')
       img = tf.read_file(imagename)
       img = tf.image.decode_jpeg(img,channels = 3)
       img = tf.image.convert_image_dtype(img,dtype = tf.float32)
       img = tf.image.resize_images(img,(testsize,testsize),method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
       img = tf.image.per_image_standardization(img)

       imgnumpy = img.eval()
       imgs = np.zeros([1,testsize,testsize,3],dtype=np.float32)
       imgs[0:1,] = imgnumpy

       result = sess.run(y, feed_dict={x:imgs})
       result = np.squeeze(result)
       if result[0] > result[1]:
           predict = 0
       else:
           predict = 1

       count = count + 1
       if str(predict) == '0':
           negcount = negcount + 1
           if str(label) == str(predict):
               negacc = negacc + 1
               acc = acc + 1
       else:
           poscount = poscount + 1
           if str(label) == str(predict):
               posacc = posacc + 1
               acc = acc + 1
   
       print result
print "acc = ",float(acc) / float(count)
print "poscount=",poscount
print "posacc = ",float(posacc) / float(poscount)
print "negcount=",negcount
print "negacc = ",float(negacc) / float(negcount)

从上面的代码可知,与 Train 时同样,需要定义模型,这个跟 Caffe 在测试时使用的 Deploy 是一样的。

然后,用 restore 函数从 saver 中载入参数,读取图像并准备好网络的格式,sess.run 就可以得到最终的结果了。

 

04 总结

本篇内容讲解了一个最简单的分类例子,相比大部分已封装好的 mnist 或 cifar 为例的代码来说更实用。我们自己准备了数据集,自己设计了网络并进行了结果可视化,学习了如何使用已经训练好的模型做预测。

 

同时,在我的知乎专栏也会开始同步更新这个模块,欢迎来交流

https://zhuanlan.zhihu.com/c_151876233

注:部分图片来自网络

—END—

本系列完整文章:

第一篇:【caffe速成】caffe图像分类从模型自定义到测试

第二篇:【tensorflow速成】Tensorflow图像分类从模型自定义到测试

第三篇:【pytorch速成】Pytorch图像分类从模型自定义到测试

第四篇:【paddlepaddle速成】paddlepaddle图像分类从模型自定义到测试

第五篇:【Keras速成】Keras图像分类从模型自定义到测试

第六篇:【mxnet速成】mxnet图像分类从模型自定义到测试

第七篇:【cntk速成】cntk图像分类从模型自定义到测试

第八篇:【chainer速成】chainer图像分类从模型自定义到测试

第九篇:【DL4J速成】Deeplearning4j图像分类从模型自定义到测试

第十篇:【MatConvnet速成】MatConvnet图像分类从模型自定义到测试

第十一篇:【Lasagne速成】Lasagne/Theano图像分类从模型自定义到测试

第十二篇:【darknet速成】Darknet图像分类从模型自定义到测试

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI!

 

 

深度学习实战入门:72小时跑通端到端图像分类项目 深度学习并非高不可攀的数学理论,而是一种可快速上手的工程化工具。其核心原理在于利用预训练模型(如ResNet50、MobileNetV2)作为通用特征提取器,通过迁移学习与微调技术,在小样本数据上高效适配具体业务任务。这种范式大幅降低算力门槛与开发成本,使Excel用户、Python脚本工程师也能在无GPU、无CUDA环境下完成真实场景建模。典型应用场景包括工业质检(铝罐凹痕识别)、智能硬件(手机拍照咖啡杯分类)、移动端AI集成等。本文聚焦‘Short Journey’实践路径——以Keras为载体,从数据 阅读详情

相关推荐

TensorFlow开发者认证实战指南:从工程直觉到考场通关

TensorFlow开发者认证并非算法理论考试,而是面向工业落地的端到端AI工程能力验证。它聚焦三大核心任务——图像分类(CNN)、自然语言处理(NLP)与时间序列预测(Sequence),强调在无外部依赖、纯CPU环境下的数据清洗、模型构建、训练调优与结果可解释性。考试以真实数据集(如MNIST、IMDB、Sunspots)为基准,严格评估准确率、MAE、F1-score等硬指标,倒逼考生掌握tf.data流水线、TensorBoard调试、LSTM状态管理、Embedding冷启动等关键技能。本文基于高

张沈鹏,在路上 ... 369

测试TensorFlow

测试TensorFlow

daguantou的博客 1983

50岁ATM工程师的TensorFlow认证实战路径

TensorFlow开发者认证并非传统知识考试,而是面向工业落地的端到端AI工程能力压力测试。它聚焦模型可复现性、部署确定性与生产级交付能力,核心考察数据管道构建、模型调试调优、跨环境兼容性及.h5格式标准化交付等硬技能。区别于学术导向的深度学习理论,该认证强调在真实约束(如TF 2.9旧版本、无pip安装、CPU-only环境)下,将原始数据转化为可验证精度的推理服务——这正是嵌入式、安全、运维等传统IT工程师切入AI落地的关键跳板。文中详述的tf.data优化、Tokenizer避坑、BatchNorm

张沈鹏,在路上 ... 399

Tensorflow2.0快速入门

准备数据:采集大量“特征/标签”数据 搭建网络:搭建神经网络结构 优化参数:训练网络获取最佳参数(反传) 应用网络:将网络保存为模型,输入新数据,输出分类或预测结果(前传) 1)输入时有两个 一个是样本参数,一个是标准答案2)神经网络前向过程实际就是求一个样本是各个答案的概率公式 y=x*w+b其中w、b都是随机值,神经网络的目的就是通过反向训练获得一个最优的w和b,从而让样本计算出是标准答案的概率最大3)损失函数就是判断w和b的优劣性的函数,因此此时目的转化为求w和b使得损失函数最小4)从而引出了梯度

internetv的博客 1760

TensorFlow绘制loss/accuracy曲线的实例

今天小编就为大家分享一篇TensorFlow绘制loss/accuracy曲线的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

(OSTrack)Joint Feature Learning and Relation Modeling for Tracking A One-Stream Framework

Joint Feature Learning and Relation Modeling for Tracking A One-Stream Framework (OSTrack)

小火山的博客 1653

图像分类----图片测试

图像分类----图片测试

weixin_43557816的博客 522

微信小程序音视频通话(for硬件)授权与设备注册实战指南

本文详细介绍了微信小程序音视频通话(for硬件)组件的开发实践,涵盖授权流程、设备注册与VoIP插件集成。重点解析了如何通过服务端获取snTicket实现用户授权,确保硬件设备与微信端的音视频通话安全可靠,适用于智能门禁、话机等物联网场景。

u6v7w8x的博客 945

零基础小白如何快速入门TensorFlow

学习 TensorFlow 需要时间和实践,但通过不断的练习和参与项目,你会逐渐掌握深度学习和机器学习的核心概念和技术。最重要的是动手实践,通过实践来不断解决问题和优化代码,这样才能深入理解 TensorFlow 的强大功能。

小宝哥Code的专栏 3096

004.PADS VX2.4常用快捷键及无模命令

PADS系列文章

qq_36492361的博客 4967

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 788

darknet框架_【通知】有三AI发布150页深度学习开源框架指导手册与GitHub项目,欢迎加入我们的开源团队...

之前我们公众号输出了很多深度学习开源框架相关的内容,今天整理成技术手册给大家分享以方便阅读,下面是详细信息。开源框架背景现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet等。如何选择...

weixin_39780962的博客 88

【技术纵览】行为识别前沿模型演进:从CNN到多模态大模型

本文全面解析了行为识别技术从CNN到多模态大模型的演进历程,重点介绍了SlowFast、TimeSformer、VideoMAE和InternVideo等SOTA模型的核心创新与应用实践。通过对比分析各代模型在Kinetics-400等数据集上的表现,揭示了自监督学习和多模态融合如何推动行为识别准确率突破85%,并探讨了工业部署中的技术选型策略与优化方向。

weixin_29169505的博客 155

darknet框架_【杂谈】超过12个,150页深度学习开源框架指导手册与GitHub项目,初学CV你值得拥有...

之前我们公众号输出了很多深度学习开源框架相关的内容,今天整理成技术手册给大家分享以方便阅读,下面是详细信息。开源框架背景现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet等。如何选择...

weixin_39745269的博客 92

Qt Installer Framework4.6.1的最基础使用1(win10+离线安装包 )

因工作需要,win程序发布后,打包成一可执行exe文件,且兼容win7系统笔者记录了一些关键要点,供有需要的小伙伴使用。

aggs1990的专栏 904

【PINN物理信息网络】基于PINN物理信息网络求解泊松方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解泊松方程(python)

k8291121的博客 2813

【杂谈】超过12个,150页深度学习开源框架指导手册与GitHub项目,初学CV你值得拥有...

之前我们公众号输出了很多深度学习开源框架相关的内容,今天整理成技术手册给大家分享以方便阅读,下面是详细信息。开源框架背景现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的...

hacker_long的专栏 427

组态王的日历时间控件脚本

日期时间控件中的脚本中在小于10的月份和天数前必须要加上0,这是由首字符对比机制规定的,首字母相同,就不再不做对比了,比如1和11,是一样的。首字母不同,再比较下一位。 float Ayear1; float Amonth1; float Aday1; string temp1; Ayear1=sd.Year; Amonth1=sd.Month; Aday1=sd.Day; temp1=StrFromInt( Ayear1, 10 ); if(Amonth1<10) temp1=temp1+"-0"+

逍遥子的博客 5718

darknet框架_【杂谈】面向新手的深度学习开源框架指导手册与GitHub项目,欢迎加入我们的开源团队...

之前我们公众号输出了很多深度学习开源框架相关的内容,现在整理成技术手册给大家分享以方便阅读,下面是详细信息。开源框架背景现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet等。如何选择...

weixin_39634438的博客 123

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Keras速成】Keras图像分类从模型自定义到测试

这是给大家准备的Keras速成例子这一次我们讲讲keras这个简单、流行的深度学习框架,一个图像分类任务从训练到测试出结果的全流程。相关的代码、数据都在我们 Git 上,希望大家 Fol...

weixin_40920183的博客 292

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Lasagne速成】Lasagne/Theano图像分类从模型自定义到测试

欢迎来到专栏《2小时玩转开源框架系列》,这是我们第11篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer,deeplearning4j,matconvnet。 今天说Lasagne,本文所用到的数据,代码请参考我们官方git https://github.com/longpeng2008/LongPen...

hacker_long的专栏 1509

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CNN与迁移学习实战:从零搭建可部署的图像分类模型

卷积神经网络(CNN)是计算机视觉的核心基础,它通过局部感受野、权值共享和层次化特征提取,模拟人类视觉机制实现端到端图像理解;迁移学习则利用预训练模型在大规模数据上习得的通用表征能力,显著降低小样本、低算力场景下的建模门槛。其技术价值在于平衡性能、效率与工程可行性,广泛应用于工业质检、医疗影像分析、智能零售等真实业务场景。本文聚焦TensorFlow/Keras生态下的轻量级落地实践,涵盖VGG16迁移微调、数据增强策略、归一化必要性、LeakyReLU鲁棒性优化及模型量化部署等关键环节,提供可复现、可调试

anque1234的博客 601

TensorFlow新手实操指南:从环境配置到可调试图像分类

TensorFlow是Google推出的开源机器学习框架,核心基于计算图与自动微分机制,支持GPU加速和分布式训练。其技术价值在于将复杂模型封装为可复用、可部署的模块化组件,广泛应用于图像识别、自然语言处理等AI工程场景。然而初学者常在环境安装、数据加载、shape匹配和梯度调试等基础环节受阻——例如import失败、tf.data报错、loss不下降或GPU不可用。本文聚焦TensorFlow实操与调试两大高频痛点,以2024年最新稳定版(TF 2.16.1 + CUDA 12.2)为基准,手把手构建端到

weixin_34128839的博客 351

10分钟完成 Windows 与 Office 本地激活:KMS_VL_ALL_AIO 脚本快速上手

KMS_VL_ALL_AIO 是一个开源免费的本地 KMS 激活脚本,双击一次即可让 Windows 7 到 11、Office 2010 到 2024 全部进入激活状态,支持自动续期与零售版转批量。适合希望一次完成 Windows 激活、Office 激活的个人用户,也适合需要批量部署的 IT 管理员。 ## 🧩 外部 KMS 服务器为何会失效:把服务器搬进本地 不少人都遇到过这种情况:激

gitblog_00121的博客 686

AI时代就业指南:Java程序员转型大模型开发,高薪风口,速成攻略

随着AI大模型时代的到来,Java程序员转向大模型开发面临挑战与机遇。转行需分五步:学习基础知识、掌握工具框架、提升编程能力、补充数学知识、参与项目实践。Java程序员在工程化实施方面具备优势。AI领域涌现多个高薪岗位,如AI工程师、数据工程师等,需掌握数学、编程、机器学习等知识。当前AI人才缺口超500万,薪资涨幅达40%+。抓住AI风口需系统学习,文末提供免费AI大模型学习资源包助力转型。

weixin_55154866的博客 528

【好专栏】深度学习框架不会用?12大主流深度学习框架快速入门,你值得拥有!...

欢迎来到【好专栏】,本次我们给大家推荐一个专栏,名为《12 大深度学习开源框架快速入门》,这个专栏为介绍了深度学习的 12 大主流框架,附带实践案例,能够让读者快速掌握深度学习框架的使用...

Leong Blog 516
上一篇: 【caffe速成】caffe图像分类从模型自定义到测试
下一篇: 【Keras速成】Keras图像分类从模型自定义到测试
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值