热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习之CapsuleNets理论与Python实践!


摘要:本文对胶囊网络进行了非技术性的简要概括,分析了其两个重要属性,之后针对MNIST手写体数据集上验证多层感知机、卷积神经网络以及胶囊网络的性能。

神经网络于上世纪50年代提出,直到最近十年里才得以发展迅速,正改变我们世界的方方面面。从图像分类到自然语言处理,研究人员正在对不同领域建立深层神经网络模型并取得相关的突破性成果。但是随着深度学习的进一步发展,又面临新的瓶颈——只对成熟网络模型进行加深加宽操作。直到最近,Hinton老爷子提出了新的概念——胶囊网络(Capsule Networks),它提高了传统方法的有效性和可理解性。

深度学习之CapsuleNets理论与Python实践!

本文将讲解胶囊网络受欢迎的原因以及通过实际代码来加强和巩固对该概念的理解。

为什么胶囊网络受到这么多的关注?

对于每种网络结构而言,一般用MINST手写体数据集验证其性能。对于识别数字手写体问题,即给定一个简单的灰度图,用户需要预测它所显示的数字。这是一个非结构化的数字图像识别问题,使用深度学习算法能够获得最佳性能。本文将以这个数据集测试三个深度学习模型,即:多层感知机(MLP)、卷积神经网络(CNN)以及胶囊网络Capsule Networks)。

多层感知机(MLP)

使用Keras建立多层感知机模型,代码如下:

# define variables

input_num_units =784

hidden_num_units =50

output_num_units =10

epochs =15

batch_size =128

# create model

model =Sequential ([Dense (units =hidden_num_units ,input_dim =input_num_units ,activation ='relu'),Dense (units =output_num_units ,input_dim =hidden_num_units ,activation ='softmax'),])

# compile the model with necessary attributes

model .compile (loss ='categorical_crossentropy',optimizer ='adam',metrics =['accuracy'])

打印模型参数概要:

深度学习之CapsuleNets理论与Python实践!

在经过15次迭代训练,结果如下:

Epoch 14/1534300/34300 [==============================] - 1s 41us/step - loss: 0.0597 - acc: 0.9834 - val_loss: 0.1227 - val_acc: 0.9635Epoch 15/1534300/34300 [==============================] - 1s 41us/step - loss: 0.0553 - acc: 0.9842 - val_loss: 0.1245 - val_acc: 0.9637

可以看到,该模型实在是简单!

卷积神经网络(CNN)

卷积神经网络在深度学习领域应用十分广泛,表现优异。下面构建卷积神经网络模型,代码如下:

# define variables

input_shape =(28,28,1)

hidden_num_units =50

output_num_units =10

batch_size =128

model =Sequential ([InputLayer (input_shape =input_reshape ),Convolution2D (25,5,5,activation ='relu'),MaxPooling2D (pool_size =pool_size ),Convolution2D (25,5,5,activation ='relu'),MaxPooling2D (pool_size =pool_size ),Convolution2D (25,4,4,activation ='relu'),Flatten (),Dense (output_dim =hidden_num_units ,activation ='relu'),Dense (output_dim =output_num_units ,input_dim =hidden_num_units ,activation ='softmax'),])model .compile (loss ='categorical_crossentropy',optimizer ='adam',metrics =['accuracy'])

打印模型参数概要:

深度学习之CapsuleNets理论与Python实践!

从上图可以发现,CNN比MLP模型更加复杂,下面看看其性能:

Epoch 14/1534/34 [==============================] - 4s 108ms/step - loss: 0.1278 - acc: 0.9604 - val_loss: 0.0820 - val_acc: 0.9757Epoch 15/1534/34 [==============================] - 4s 110ms/step - loss: 0.1256 - acc: 0.9626 - val_loss: 0.0827 - val_acc: 0.9746

可以发现,CNN训练耗费的时间比较长,但其性能优异。

胶囊网络(Capsule Network)

胶囊网络的结构比CNN网络更加复杂,下面构建胶囊网络模型,代码如下:

defCapsNet(input_shape,n_class,routings):=layers .Input (shape =input_shape )# Layer 1: Just a conventional Conv2D layerconv1 =layers .Conv2D (filters =256,kernel_size =9,strides =1,padding ='valid',activation ='relu',name ='conv1')()# Layer 2: Conv2D layer with `squash` activation, then reshape to [None, num_capsule, dim_capsule]primarycaps =PrimaryCap (conv1 ,dim_capsule =8,n_channels =32,kernel_size =9,strides =2,padding ='valid')# Layer 3: Capsule layer. Routing algorithm works here.digitcaps =CapsuleLayer (num_capsule =n_class ,dim_capsule =16,routings =routings ,name ='digitcaps')(primarycaps )# Layer 4: This is an auxiliary layer to replace each capsule with its length. Just to match the true label's shape.# If using tensorflow, this will not be necessary. :)out_caps =Length (name ='capsnet')(digitcaps )# Decoder network.=layers .Input (shape =(n_class ,))masked_by_y =Mask ()([digitcaps ,])# The true label is used to mask the output of capsule layer. For trainingmasked =Mask ()(digitcaps )# Mask using the capsule with maximal length. For prediction# Shared Decoder model in training and predictiondecoder =models .Sequential (name ='decoder')decoder .add (layers .Dense (512,activation ='relu',input_dim =16*n_class ))decoder .add (layers .Dense (1024,activation ='relu'))decoder .add (layers .Dense (np .prod (input_shape ),activation ='sigmoid'))decoder .add (layers .Reshape (target_shape =input_shape ,name ='out_recon'))# Models for training and evaluation (prediction)train_model =models .Model ([,],[out_caps ,decoder (masked_by_y )])eval_model =models .Model (,[out_caps ,decoder (masked )])# manipulate modelnoise =layers .Input (shape =(n_class ,16))noised_digitcaps =layers .Add ()([digitcaps ,noise ])masked_noised_y =Mask ()([noised_digitcaps ,])manipulate_model =models .Model ([,,noise ],decoder (masked_noised_y ))returntrain_model ,eval_model ,manipulate_model

打印模型参数概要:

深度学习之CapsuleNets理论与Python实践!

该模型耗费时间比较长,训练一段时间后,得到如下结果:

Epoch 14/1534/34 [==============================] - 108s 3s/step - loss: 0.0445 - capsnet_loss: 0.0218 - decoder_loss: 0.0579 - capsnet_acc: 0.9846 - val_loss: 0.0364 - val_capsnet_loss: 0.0159 - val_decoder_loss: 0.0522 - val_capsnet_acc: 0.9887Epoch 15/1534/34 [==============================] - 107s 3s/step - loss: 0.0423 - capsnet_loss: 0.0201 - decoder_loss: 0.0567 - capsnet_acc: 0.9859 - val_loss: 0.0362 - val_capsnet_loss: 0.0162 - val_decoder_loss: 0.0510 - val_capsnet_acc: 0.9880

可以发现,该网络比之前传统的网络模型效果更好,下图总结了三个实验结果:

深度学习之CapsuleNets理论与Python实践!

这个实验也证明了胶囊网络值得我们深入的研究和讨论。

胶囊网络背后的概念

为了理解胶囊网络的概念,本文将以猫的图片为例来说明胶囊网络的潜力,首先从一个问题开始——下图中的动物是什么?

深度学习之CapsuleNets理论与Python实践!

它是一只猫,你肯定猜对了吧!但是你是如何知道它是一只猫的呢?现在将这张图片进行分解:

情况1——简单图像

深度学习之CapsuleNets理论与Python实践!

你是如何知道它是一只猫的呢?可能的方法是将其分解为单独的特征,如眼睛、鼻子、耳朵等。如下图所示:

深度学习之CapsuleNets理论与Python实践!

因此,本质上是把高层次的特征分解为低层次的特征。比如定义为:

P() = P(鼻子) & ( 2 x P(胡须) ) & P(嘴巴) & ( 2 x P(眼睛) ) & ( 2 x P(耳朵) )

其中,P() 定义为图像中猫脸的存在。通过迭代,可以定义更多的低级别特性,如形状和边缘,以简化过程。

情况2——旋转图像

将图像旋转30度,如下图所示:

深度学习之CapsuleNets理论与Python实践!

如果还是按照之前定义的相同特征,那么将无法识别出它是猫。这是因为底层特征的方向发生了改变,导致先前定义的特征也将发生变化。

深度学习之CapsuleNets理论与Python实践!

综上,猫识别器可能看起来像这样:

深度学习之CapsuleNets理论与Python实践!

更具体一点,表示为:

P() = ( P(鼻子) & ( 2 x P(胡须) ) & P(嘴巴) & ( 2 x P(眼睛) ) & ( 2 x P(耳朵) ) ) OR

( P(rotated_鼻子) & ( 2 x P(rotated_胡须) ) & P(rotated_嘴巴) & ( 2 x P(rotated_眼睛) ) & ( 2 x P(rotated_耳朵) ) )

情况3——翻转图像

为了增加复杂性,下面是一个完全翻转的图像:

深度学习之CapsuleNets理论与Python实践!

可能想到的方法是靠蛮力搜索低级别特征所有可能的旋转,但这种方法耗时耗力。因此,研究人员提出,包含低级别特征本身的附加属性,比如旋转角度。这样不仅可以检测特征是否存在,还可以检测其旋转是否存在,如下图所示:

深度学习之CapsuleNets理论与Python实践!

更具体一点,表示为:

P() = [ P(鼻子), R(鼻子) ] & [ P(胡须_1), R(胡须_1) ] & [ P(胡须_2), R(胡须_2) ] & [ P(嘴巴), R(嘴巴) ] & …

其中,旋转特征用R()表示,这一特性也被称作旋转等价性。

从上述情况中可以看到,扩大想法之后能够捕捉更多低层次的特征,如尺度、厚度等,这将有助于我们更清楚地理解一个物体的形象。这就是胶囊网络在设计时设想的工作方式。

胶囊网络另外一个特点是动态路由,下面以猫狗分类问题讲解这个特点。

深度学习之CapsuleNets理论与Python实践!

上面两只动物看起来非常相似,但存在一些差异。你可以从中发现哪只是狗吗?

正如之前所做的那样,将定义图像中的特征以找出其中的差异。

深度学习之CapsuleNets理论与Python实践!

如图所示,定义非常低级的面部特征,比如眼睛、耳朵等,并将其结合以找到一个脸。之后,将面部和身体特征结合来完成相应的任务——判断它是一只猫或狗。

现在假设有一个新的图像,以及提取的低层特征,需要根据以上信息判断出其类别。我们从中随机选取一个特征,比如眼睛,可以只根据它来判断其类别吗?

深度学习之CapsuleNets理论与Python实践!

答案是否定的,因为眼睛并不是一个区分因素。下一步是分析更多的特征,比如随机挑选的下一个特征是鼻子。

深度学习之CapsuleNets理论与Python实践!

只有眼睛和鼻子特征并不能够完成分类任务,下一步获取所有特征,并将其结合以判断所属类别。如下图所示,通过组合眼睛、鼻子、耳朵和胡须这四个特征就能够判断其所属类别。基于以上过程,将在每个特征级别迭代地执行这一步骤,就可以将正确的信息路由到需要分类信息的特征检测器。

深度学习之CapsuleNets理论与Python实践!

在胶囊构件中,当更高级的胶囊同意较低级的胶囊输入时,较低级的胶囊将其输入到更高级胶囊中,这就是动态路由算法的精髓。

胶囊网络相对于传统深度学习架构而言,在对数据方向和角度方面更鲁棒,甚至可以在相对较少的数据点上进行训练。胶囊网络存在的缺点是需要更多的训练时间和资源。

胶囊网络在MNIST数据集上的代码详解

首先从识别数字手写体项目下载数据集,数字手写体识别问题主要是将给定的28x28大小的图片识别出其显示的数字。在开始运行代码之前,确保安装好Keras

下面打开Jupyter Notebook软件,输入以下代码。首先导入所需的模块:

然后进行随机初始化:

# To stop potential randomness

seed =128

rng =np .random .RandomState (seed )

下一步设置目录路径:

root_dir =os .path .abspath ('.')

data_dir =os .path .join (root_dir ,'data')

下面加载数据集,数据集是“.CSV”格式。

train = pd.read_csv(os.path.join(data_dir, 'train.csv'))test = pd.read_csv(os.path.join(data_dir, 'test.csv'))train.head()

展示数据表示的数字:

img_name = rng.choice(train.filename)filepath = os.path.join(data_dir, 'train', img_name)img = imread(filepath, flatten= True)pylab.imshow(img, cmap= 'gray')pylab.axis( 'off')pylab.show()

深度学习之CapsuleNets理论与Python实践!

现在将所有图像保存为Numpy数组:

temp = [] forimg_name intrain.filename: image_path = os.path.join(data_dir, 'train', img_name) img = imread(image_path, flatten= True) img = img.astype( 'float32') temp.append(img) train_x = np.stack(temp)train_x /= 255.0

train_x = train_x.reshape( -1784).astype( 'float32')temp = [] forimg_name intest.filename: image_path = os.path.join(data_dir, 'test', img_name) img = imread(image_path, flatten= True) img = img.astype( 'float32') temp.append(img) test_x = np.stack(temp)test_x /= 255.0

test_x = test_x.reshape( -1784).astype( 'float32')train_y = keras.utils.np_utils.to_categorical(train.label.values)

这是一个典型的机器学习问题,将数据集分成7:3。其中70%作为训练集,30%作为验证集。

split_size = int(train_x.shape[ 0]* 0.7)train_x, val_x = train_x[:split_size], train_x[split_size:]train_y, val_y = train_y[:split_size], train_y[split_size:]

下面将分析三个不同深度学习模型对该数据的性能,分别是多层感知机、卷积神经网络以及胶囊网络。

1.多层感知机

定义一个三层神经网络,一个输入层、一个隐藏层以及一个输出层。输入和输出神经元的数目是固定的,输入为28x28图像,输出是代表类的10x1向量,隐层设置为50个神经元,并使用梯度下降算法训练。

# define vars

input_num_units = 784

hidden_num_units = 50

output_num_units = 10

epochs = 15

batch_size = 128

# import keras modules

fromkeras.models importSequential

fromkeras.layers importInputLayer, Convolution2D, MaxPooling2D, Flatten, Dense

# create model

model = Sequential([ Dense(units=hidden_num_units, input_dim=input_num_units, activation= 'relu'), Dense(units=output_num_units, input_dim=hidden_num_units, activation= 'softmax'),]) # compile the model with necessary attributes

model.compile(loss= 'categorical_crossentropy', optimizer= 'adam', metrics=[ 'accuracy'])

打印模型参数概要:

深度学习之CapsuleNets理论与Python实践!

trained_model = model.fit(train_x, train_y, nb_epoch=epochs, batch_size=batch_size, validation_data=(val_x, val_y))

在迭代15次之后,结果如下:

Epoch 1415

3430034300[==============================] - 141us/step - loss: 0.0597- acc: 0.9834- val_loss: 0.1227- val_acc: 0.9635

Epoch 1515

3430034300[==============================] - 141us/step - loss: 0.0553- acc: 0.9842- val_loss: 0.1245- val_acc: 0.9637

结果不错,但可以继续改进。

2.卷积神经网络

把图像转换成灰度图(2D),然后将其输入到CNN模型中:

# reshape data

train_x_temp = train_x.reshape( -128281)val_x_temp = val_x.reshape( -128281)

# define varsinput_shape = ( 784,)input_reshape = ( 28281)pool_size = ( 22)hidden_num_units = 50output_num_units = 10batch_size = 128

下面定义CNN模型:

model = Sequential([ InputLayer(input_shape=input_reshape),Convolution2D( 2555, activation= 'relu'), MaxPooling2D(pool_size=pool_size),Convolution2D( 2555, activation= 'relu'), MaxPooling2D(pool_size=pool_size),Convolution2D( 2544, activation= 'relu'),Flatten(),Dense(output_dim=hidden_num_units, activation= 'relu'),Dense(output_dim=output_num_units, input_dim=hidden_num_units, activation= 'softmax'),])model.compile(loss= 'categorical_crossentropy', optimizer= 'adam', metrics=[ 'accuracy']) #trained_model_cOnv= model.fit(train_x_temp, train_y, nb_epoch=epochs, batch_size=batch_size, validation_data=(val_x_temp, val_y))model.summary()

打印模型参数概要:

深度学习之CapsuleNets理论与Python实践!

通过增加数据来调整进程:

# Begin: Training with data augmentation ---------------------------------------------------------------------#deftrain_generator(x, y, batch_size, shift_fraction=0.1):train_datagen = ImageDataGenerator(width_shift_range=shift_fraction, height_shift_range=shift_fraction)

# shift up to 2 pixel for MNISTgenerator = train_datagen.flow(x, y, batch_size=batch_size)

while1: x_batch, y_batch = generator.next()

yield([x_batch, y_batch]) # Training with data augmentation. If shift_fraction=0., also no augmentation.trained_model2 = model.fit_generator(generator=train_generator(train_x_temp, train_y, 10000.1), steps_per_epoch=int(train_y.shape[ 0] / 1000), epochs=epochs, validation_data=[val_x_temp, val_y])

# End: Training with data augmentation -----------------------------------------------------------------------#

CNN模型的结果:

Epoch 1415

3434[==============================] - 4108ms/step - loss: 0.1278- acc: 0.9604- val_loss: 0.0820- val_acc: 0.9757

Epoch 1515

3434[==============================] - 4110ms/step - loss: 0.1256- acc: 0.9626- val_loss: 0.0827- val_acc: 0.9746

3.胶囊网络

建立胶囊网络模型,结构如图所示:

深度学习之CapsuleNets理论与Python实践!

下面建立该模型,代码如下:

defCapsNet(input_shape, n_class, routings):""" A Capsule Network on MNIST. :param input_shape: data shape, 3d, [width, height, channels] :param n_class: number of classes :param routings: number of routing iterations :return: Two Keras Models, the first one used for training, and the second one for evaluation. `eval_model` can also be used for training. """x = layers.Input(shape=input_shape)

# Layer 1: Just a conventional Conv2D layerconv1 = layers.Conv2D(filters= 256, kernel_size= 9, strides= 1, padding= 'valid', activation= 'relu', name= 'conv1')(x) # Layer 2: Conv2D layer with `squash` activation, then reshape to [None, num_capsule, dim_capsule]primarycaps = PrimaryCap(conv1, dim_capsule= 8, n_channels= 32, kernel_size= 9, strides= 2, padding= 'valid'# Layer 3: Capsule layer. Routing algorithm works here.digitcaps = CapsuleLayer(num_capsule=n_class, dim_capsule= 16, routings=routings, name= 'digitcaps')(primarycaps)

# Layer 4: This is an auxiliary layer to replace each capsule with its length. Just to match the true label's shape.# If using tensorflow, this will not be necessary. :)out_caps = Length(name= 'capsnet')(digitcaps)

# Decoder network.y = layers.Input(shape=(n_class,)) masked_by_y = Mask()([digitcaps, y])

# The true label is used to mask the output of capsule layer. For trainingmasked = Mask()(digitcaps)

# Mask using the capsule with maximal length. For prediction# Shared Decoder model in training and predictiondecoder = models.Sequential(name= 'decoder') decoder.add(layers.Dense( 512, activation= 'relu', input_dim= 16*n_class)) decoder.add(layers.Dense( 1024, activation= 'relu')) decoder.add(layers.Dense(np.prod(input_shape), activation= 'sigmoid')) decoder.add(layers.Reshape(target_shape=input_shape, name= 'out_recon')) # Models for training and evaluation (prediction)train_model = models.Model([x, y], [out_caps, decoder(masked_by_y)]) eval_model = models.Model(x, [out_caps, decoder(masked)])

# manipulate modelnoise = layers.Input(shape=(n_class, 16)) noised_digitcaps = layers.Add()([digitcaps, noise]) masked_noised_y = Mask()([noised_digitcaps, y]) manipulate_model = models.Model([x, y, noise], decoder(masked_noised_y)) returntrain_model, eval_model, manipulate_model defmargin_loss(y_true, y_pred):""" Margin loss for Eq.(4). When y_true[i, :] contains not just one `1`, this loss should work too. Not test it. :param y_true: [None, n_classes] :param y_pred: [None, num_capsule] :return: a scalar loss value. """L = y_true * K.square(K.maximum( 0.0.9- y_pred)) + 0.5* ( 1- y_true) * K.square(K.maximum( 0., y_pred - 0.1)) returnK.mean(K.sum(L, 1))model, eval_model, manipulate_model = CapsNet(input_shape=train_x_temp.shape[ 1:], n_class=len(np.unique(np.argmax(train_y, 1))), routings= 3)

# compile the modelmodel.compile(optimizer=optimizers.Adam(lr= 0.001), loss=[margin_loss, 'mse'], loss_weights=[ 1.0.392], metrics={ 'capsnet''accuracy'})model.summary()

打印模型参数概要:

深度学习之CapsuleNets理论与Python实践!

胶囊模型的结果:

Epoch 1415

3434[==============================] - 1083s/step - loss: 0.0445- capsnet_loss: 0.0218- decoder_loss: 0.0579- capsnet_acc: 0.9846- val_loss: 0.0364- val_capsnet_loss: 0.0159- val_decoder_loss: 0.0522- val_capsnet_acc: 0.9887

Epoch 1515

3434[==============================] - 1073s/step - loss: 0.0423- capsnet_loss: 0.0201- decoder_loss: 0.0567- capsnet_acc: 0.9859- val_loss: 0.0362- val_capsnet_loss: 0.0162- val_decoder_loss: 0.0510- val_capsnet_acc: 0.9880

为了便于总结分析,将以上三个实验的结构绘制出测试精度图:

plt.figure(figsize=( 108))plt.plot(trained_model.history[ 'val_acc'], 'r', trained_model2.history[ 'val_acc'], 'b', trained_model3.history[ 'val_capsnet_acc'], 'g')plt.legend(( 'MLP''CNN''CapsNet'), loc= 'lower right', fOntsize= 'large')plt.title( 'Validation Accuracies')plt.show()

深度学习之CapsuleNets理论与Python实践!

从结果中可以看出,胶囊网络的精度优于CNN和MLP。

总结:本文对胶囊网络进行了非技术性的简要概括,分析了其两个重要属性,之后针对MNIST手写体数据集上验证多层感知机、卷积神经网络以及胶囊网络的性能。

https://www.analyticsvidhya.com/blog/2018/04/essentials-of-deep-learning-getting-to-know-capsulenets/?spm=a2c4e.11153959.blogcont581717.15.679065e8zrSOGU


推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
author-avatar
澳洲开奥拓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有