深度学习(10)-- Capsules Networks(CapsNet)

				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.csdn.net/malele4th/article/details/79430464				</div><div id="content_views" class="markdown_views"><!-- flowchart 箭头图标 勿删 --><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><h1 id="lecture-11capsules-networkscapsnet"><a name="t0"></a>lecture 11:Capsules Networks(CapsNet)</h1>

目录

  • lecture 11:Capsules Networks(CapsNet)
  • 目录
    • 1、胶囊网络
      • 1.1 CNN有重要的缺点
      • 1.2 将3D世界硬编码为神经网络:逆向图形方法
    • 2、动态路由规划
      • 2.1 背景
      • 2.2 解决路由问题
      • 2.3 网络构建
    • 3、代码

1、胶囊网络

这里写图片描述
这里写图片描述
这里写图片描述

1.1 CNN有重要的缺点

CNN(卷积神经网络)真棒。这是今天深度学习如此受欢迎的原因之一。他们可以做出令人惊叹的人们曾经认为计算机长期以来都无法做到的事情。尽管如此,它们有其局限性,有根本的缺陷。

让我们考虑一个非常简单和非技术性的例子。想象一张脸。组件是什么? 我们有椭圆形的脸,两只眼睛,一个鼻子和一个嘴巴。对于一个CNN来说,这些对象的存在可以成为认定图像中有一张脸的一个非常有力的指标。这些组件之间的定向关系和相对空间关系对CNN来说并不重要。

这里写图片描述
对CNN来说两幅图是相似的,因为它们包含相似的元素。

CNN如何工作?

  • CNN的主要组成部分是一个卷积层 它的工作是检测图像像素中的重要特征。
  • 较深层(接近输入)将学习检测诸如边缘和颜色渐变等简单特征
  • 而更高层将简单特征组合成更复杂的特征。
  • 最后,网络顶部的密集层将结合非常高级的特征并产生分类预测。

需要了解的重要一点是,更高级别的特征以加权和的方式将较低级特征组合:

(1)前一层的激活与下一层神经元的权重相乘并相加,然后传递到非线性激活。
(2)在这个设置中,没有任何地方在构成更高级特征的简单特征之间存在姿态(平移和旋转)关系。
(3)CNN解决这个问题的方法是使用最大池化或连续卷积层来减少流经网络的数据的空间大小,从而增加高层神经元的“视野”,从而允许他们检测输入图像的较大区域的高阶特征。
(4)最大的池化是一个使卷积网络工作得非常好的拐杖,在许多领域实现了超人的表现。

但是不要被它的表现所迷惑:

  • 虽然CNN比之前的任何模式都要好,但是最大池化会失去有价值的信息。
  • Hinton:“卷积神经网络中使用的池化操作是一个很大的错误,它运行得很好的事实是一场灾难。”
  • 当然,你可以用传统的CNNs来替代最大的池化,但是仍然不能解决关键问题:
  • 卷积神经网络的内部数据表示不考虑简单和复杂对象之间的重要空间层次。

在上面的例子中,图片中仅存在2只眼睛1张嘴巴和1只鼻子并不意味着有一张脸,我们也需要知道这些物体相对于彼此处于怎样的位置。

1.2 将3D世界硬编码为神经网络:逆向图形方法

计算机图形学涉及从几何数据的内部分层表示来构造可视图像。请注意,这种表示的结构需要考虑对象的相对位置。该内部表示作为表示这些对象的相对位置和方向的几何对象,以矩阵的阵列形式存储在计算机的存储器中。然后,特殊软件将该表示转换成屏幕上的图像。这就是所谓的渲染。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
胶囊网络比其他模型要好得多,可以告诉上下行的图像是同一类,视角不同。 最新的论文使错误率降低了45%。

2、动态路由规划

2.1 背景

目前的神经网络中,每一层的神经元都做的是类似的事情,比如一个卷积层内的每个神经元都做的是一样的卷积操作。

  • 而Hinton坚信,不同的神经元完全可以关注不同的实体或者属性,比如在一开始就有不同的神经元关注不同的类别(而不是到最后才有归一化分类)。
  • 具体来说,有的神经元关注位置、有的关注尺寸、有的关注方向。这类似人类大脑中语言、视觉都有分别的区域负责,而不是分散在整个大脑中。

为了避免网络结构的杂乱无章,Hinton提出把关注同一个类别或者同一个属性的神经元打包集合在一起,好像胶囊一样。

  • 在神经网络工作时,这些胶囊间的通路形成稀疏激活的树状结构(整个树中只有部分路径上的胶囊被激活),从而形成了他的Capsule理论。Capsule也就具有更好的解释性。
  • 值得一提的是,同在谷歌大脑(但不在同一个办公室)的Jeff Dean也认为稀疏激活的神经网络是未来的重要发展方向,不知道他能不能也提出一些不同的实现方法来。

Capsule这样的网络结构在符合人们“一次认知多个属性”的直观感受的同时,也会带来另一个直观的问题,那就是不同的胶囊应该如何训练、又如何让网络自己决定胶囊间的激活关系。Hinton这篇论文解决的重点问题就是不同胶囊间连接权重(路由)的学习。

2.2 解决路由问题

  • 首先,每个层中的神经元分组形成不同的胶囊,每个胶囊有一个“活动向量”activity vector,它是这个胶囊对于它关注的类别或者属性的表征。
  • 树结构中的每个节点就对应着一个活动的胶囊。
  • 通过一个迭代路由的过程,每个活动的胶囊都会从高一层网络中的胶囊中选择一个,让它成为自己的母节点。
  • 对于高阶的视觉系统来说,这样的迭代过程就很有潜力解决一个物体的部分如何层层组合成整体的问题。

对于实体在网络中的表征,众多属性中有一个属性比较特殊,那就是它出现的概率(网络检测到某一类物体出现的置信度)。

  • 一般典型的方式是用一个单独的、输出0到1之间的回归单元来表示,0就是没出现,1就是出现了。
  • 在这篇论文中,Hinton想用活动向量同时表示一个实体是否出现以及这个实体的属性。
  • 他的做法是用向量不同维度上的值分别表示不同的属性,然后用整个向量的模表示这个实体出现的概率。
  • 为了保证向量的长度,也就是实体出现的概率不超过1,向量会通过一个非线性计算进行标准化,这样实体的不同属性也就实际上体现为了这个向量在高维空间中的方向。

采用这样的活动向量有一个很大的好处,就是可以帮助低层级的胶囊选择自己连接到哪个高层级的胶囊。具体做法是:

  • 一开始低层级的胶囊会给所有高层级的胶囊提供输入;
  • 然后这个低层级的胶囊会把自己的输出和一个权重矩阵相乘,得到一个预测向量。
  • 如果预测向量和某个高层级胶囊的输出向量的标量积更大,就可以形成从上而下的反馈,提高这两个胶囊间的耦合系数,降低低层级胶囊和其它高层级胶囊间的耦合系数。
  • 进行几次迭代后,贡献更大的低层级胶囊和接收它的贡献的高层级胶囊之间的连接就会占越来越重要的位置。

在论文作者们看来,这种“一致性路由”(routing-by-agreement)的方法要比之前最大池化之类只保留了唯一一个最活跃的特征的路由方法有效得多。

2.3 网络构建

作者们构建了一个简单的CapsNet。除最后一层外,网络的各层都是卷积层,但它们现在都是“胶囊”的层,其中用向量输出代替了CNN的标量特征输出、用一致性路由代替了最大池化。与CNN类似,更高层的网络观察了图像中更大的范围,不过由于不再是最大池化,所以位置信息一直都得到了保留。对于较低的层,空间位置的判断也只需要看是哪些胶囊被激活了。
这里写图片描述
这个网络中最底层的多维度胶囊结构就展现出了不同的特性,它们起到的作用就像传统计算机图形渲染中的不同元素一样,每一个胶囊关注自己的一部分特征。这和目前的计算机视觉任务中,把图像中不同空间位置的元素组合起来形成整体理解(或者说图像中的每个区域都会首先激活整个网络然后再进行组合)具有截然不同的计算特性。在底层的胶囊之后连接了PrimaryCaps层和DigitCaps层。

3.代码

capsulelayers.py

import keras.backend as K
import tensorflow as tf
from keras import initializers, layersclass Length(layers.Layer):"""Compute the length of vectors. This is used to compute a Tensor that has the same shape with y_true in margin_loss.Using this layer as model's output can directly predict labels by using `y_pred = np.argmax(model.predict(x), 1)`inputs: shape=[None, num_vectors, dim_vector]output: shape=[None, num_vectors]"""def call(self, inputs, **kwargs):return K.sqrt(K.sum(K.square(inputs), -1))def compute_output_shape(self, input_shape):return input_shape[:-1]class Mask(layers.Layer):"""Mask a Tensor with shape=[None, num_capsule, dim_vector] either by the capsule with max length or by an additional input mask. Except the max-length capsule (or specified capsule), all vectors are masked to zeros. Then flatten themasked Tensor.For example:```x = keras.layers.Input(shape=[8, 3, 2])  # batch_size=8, each sample contains 3 capsules with dim_vector=2y = keras.layers.Input(shape=[8, 3])  # True labels. 8 samples, 3 classes, one-hot coding.out = Mask()(x)  # out.shape=[8, 6]# orout2 = Mask()([x, y])  # out2.shape=[8,6]. Masked with true labels y. Of course y can also be manipulated.```"""def call(self, inputs, **kwargs):if type(inputs) is list:  # true label is provided with shape = [None, n_classes], i.e. one-hot code.assert len(inputs) == 2inputs, mask = inputselse:  # if no true label, mask by the max length of capsules. Mainly used for prediction# compute lengths of capsulesx = K.sqrt(K.sum(K.square(inputs), -1))# generate the mask which is a one-hot code.# mask.shape=[None, n_classes]=[None, num_capsule]mask = K.one_hot(indices=K.argmax(x, 1), num_classes=x.get_shape().as_list()[1])# inputs.shape=[None, num_capsule, dim_capsule]# mask.shape=[None, num_capsule]# masked.shape=[None, num_capsule * dim_capsule]masked = K.batch_flatten(inputs * K.expand_dims(mask, -1))return maskeddef compute_output_shape(self, input_shape):if type(input_shape[0]) is tuple:  # true label providedreturn tuple([None, input_shape[0][1] * input_shape[0][2]])else:  # no true label providedreturn tuple([None, input_shape[1] * input_shape[2]])def squash(vectors, axis=-1):"""The non-linear activation used in Capsule. It drives the length of a large vector to near 1 and small vector to 0:param vectors: some vectors to be squashed, N-dim tensor:param axis: the axis to squash:return: a Tensor with same shape as input vectors"""s_squared_norm = K.sum(K.square(vectors), axis, keepdims=True)scale = s_squared_norm / (1 + s_squared_norm) / K.sqrt(s_squared_norm + K.epsilon())return scale * vectorsclass CapsuleLayer(layers.Layer):"""The capsule layer. It is similar to Dense layer. Dense layer has `in_num` inputs, each is a scalar, the output of the neuron from the former layer, and it has `out_num` output neurons. CapsuleLayer just expand the output of the neuronfrom scalar to vector. So its input shape = [None, input_num_capsule, input_dim_capsule] and output shape = \[None, num_capsule, dim_capsule]. For Dense Layer, input_dim_capsule = dim_capsule = 1.:param num_capsule: number of capsules in this layer:param dim_capsule: dimension of the output vectors of the capsules in this layer:param routings: number of iterations for the routing algorithm"""def __init__(self, num_capsule, dim_capsule, routings=3,kernel_initializer='glorot_uniform',**kwargs):super(CapsuleLayer, self).__init__(**kwargs)self.num_capsule = num_capsuleself.dim_capsule = dim_capsuleself.routings = routingsself.kernel_initializer = initializers.get(kernel_initializer)def build(self, input_shape):assert len(input_shape) >= 3, "The input Tensor should have shape=[None, input_num_capsule, input_dim_capsule]"self.input_num_capsule = input_shape[1]self.input_dim_capsule = input_shape[2]# Transform matrixself.W = self.add_weight(shape=[self.num_capsule, self.input_num_capsule,self.dim_capsule, self.input_dim_capsule],initializer=self.kernel_initializer,name='W')self.built = Truedef call(self, inputs, training=None):# inputs.shape=[None, input_num_capsule, input_dim_capsule]# inputs_expand.shape=[None, 1, input_num_capsule, input_dim_capsule]inputs_expand = K.expand_dims(inputs, 1)# Replicate num_capsule dimension to prepare being multiplied by W# inputs_tiled.shape=[None, num_capsule, input_num_capsule, input_dim_capsule]inputs_tiled = K.tile(inputs_expand, [1, self.num_capsule, 1, 1])# Compute `inputs * W` by scanning inputs_tiled on dimension 0.# x.shape=[num_capsule, input_num_capsule, input_dim_capsule]# W.shape=[num_capsule, input_num_capsule, dim_capsule, input_dim_capsule]# Regard the first two dimensions as `batch` dimension,# then matmul: [input_dim_capsule] x [dim_capsule, input_dim_capsule]^T -> [dim_capsule].# inputs_hat.shape = [None, num_capsule, input_num_capsule, dim_capsule]inputs_hat = K.map_fn(lambda x: K.batch_dot(x, self.W, [2, 3]), elems=inputs_tiled)# Begin: Routing algorithm ---------------------------------------------------------------------## The prior for coupling coefficient, initialized as zeros.# b.shape = [None, self.num_capsule, self.input_num_capsule].b = tf.zeros(shape=[K.shape(inputs_hat)[0], self.num_capsule, self.input_num_capsule])assert self.routings > 0, 'The routings should be > 0.'for i in range(self.routings):# c.shape=[batch_size, num_capsule, input_num_capsule]c = tf.nn.softmax(b, dim=1)# c.shape =  [batch_size, num_capsule, input_num_capsule]# inputs_hat.shape=[None, num_capsule, input_num_capsule, dim_capsule]# The first two dimensions as `batch` dimension,# then matmal: [input_num_capsule] x [input_num_capsule, dim_capsule] -> [dim_capsule].# outputs.shape=[None, num_capsule, dim_capsule]outputs = squash(K.batch_dot(c, inputs_hat, [2, 2]))  # [None, 10, 16]if i < self.routings - 1:# outputs.shape =  [None, num_capsule, dim_capsule]# inputs_hat.shape=[None, num_capsule, input_num_capsule, dim_capsule]# The first two dimensions as `batch` dimension,# then matmal: [dim_capsule] x [input_num_capsule, dim_capsule]^T -> [input_num_capsule].# b.shape=[batch_size, num_capsule, input_num_capsule]b += K.batch_dot(outputs, inputs_hat, [2, 3])# End: Routing algorithm -----------------------------------------------------------------------#return outputsdef compute_output_shape(self, input_shape):return tuple([None, self.num_capsule, self.dim_capsule])def PrimaryCap(inputs, dim_capsule, n_channels, kernel_size, strides, padding):"""Apply Conv2D `n_channels` times and concatenate all capsules:param inputs: 4D tensor, shape=[None, width, height, channels]:param dim_capsule: the dim of the output vector of capsule:param n_channels: the number of types of capsules:return: output tensor, shape=[None, num_capsule, dim_capsule]"""output = layers.Conv2D(filters=dim_capsule*n_channels, kernel_size=kernel_size, strides=strides, padding=padding,name='primarycap_conv2d')(inputs)outputs = layers.Reshape(target_shape=[-1, dim_capsule], name='primarycap_reshape')(output)return layers.Lambda(squash, name='primarycap_squash')(outputs)

capsulenet.py

import numpy as np
from keras import layers, models, optimizers
from keras import backend as K
from keras.utils import to_categorical
import matplotlib.pyplot as plt
from utils import combine_images
from PIL import Image
from capsulelayers import CapsuleLayer, PrimaryCap, Length, MaskK.set_image_data_format('channels_last')
from resnets_utils import *def CapsNet(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=32, kernel_size=5, 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=16, kernel_size=9, strides=2, padding='valid')# Layer 3: Capsule layer. Routing algorithm works here.digitcaps = CapsuleLayer(num_capsule=n_class, dim_capsule=12, 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(64, activation='relu', input_dim=12*n_class))decoder.add(layers.Dense(32, 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, 12))noised_digitcaps = layers.Add()([digitcaps, noise])masked_noised_y = Mask()([noised_digitcaps, y])manipulate_model = models.Model([x, y, noise], decoder(masked_noised_y))return train_model, eval_model, manipulate_modeldef margin_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))return K.mean(K.sum(L, 1))def train(model, data, args):"""Training a CapsuleNet:param model: the CapsuleNet model:param data: a tuple containing training and testing data, like `((x_train, y_train), (x_test, y_test))`:param args: arguments:return: The trained model"""# unpacking the data(x_train, y_train), (x_test, y_test) = data# callbackslog = callbacks.CSVLogger(args.save_dir + '/log.csv')tb = callbacks.TensorBoard(log_dir=args.save_dir + '/tensorboard-logs',batch_size=args.batch_size, histogram_freq=int(args.debug))checkpoint = callbacks.ModelCheckpoint(args.save_dir + '/weights-{epoch:02d}.h5', monitor='val_capsnet_acc',save_best_only=True, save_weights_only=True, verbose=1)lr_decay = callbacks.LearningRateScheduler(schedule=lambda epoch: args.lr * (args.lr_decay ** epoch))# compile the modelmodel.compile(optimizer=optimizers.Adam(lr=args.lr),loss=[margin_loss, 'mse'],loss_weights=[1., args.lam_recon],metrics={'capsnet': 'accuracy'})"""# Training without data augmentation:model.fit([x_train, y_train], [y_train, x_train], batch_size=args.batch_size, epochs=args.epochs,validation_data=[[x_test, y_test], [y_test, x_test]], callbacks=[log, tb, checkpoint, lr_decay])"""# Begin: Training with data augmentation ---------------------------------------------------------------------#def train_generator(x, y, batch_size, shift_fraction=0.):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)while 1:x_batch, y_batch = generator.next()yield ([x_batch, y_batch], [y_batch, x_batch])# Training with data augmentation. If shift_fraction=0., also no augmentation.model.fit_generator(generator=train_generator(x_train, y_train, args.batch_size, args.shift_fraction),steps_per_epoch=int(y_train.shape[0] / args.batch_size),epochs=args.epochs,validation_data=[[x_test, y_test], [y_test, x_test]],callbacks=[log, tb, checkpoint, lr_decay])# End: Training with data augmentation -----------------------------------------------------------------------#model.save_weights(args.save_dir + '/trained_model.h5')print('Trained model saved to \'%s/trained_model.h5\'' % args.save_dir)from utils import plot_logplot_log(args.save_dir + '/log.csv', show=True)return modeldef test(model, data, args):x_test, y_test = datay_pred, x_recon = model.predict(x_test, batch_size=32)print('-'*30 + 'Begin: test' + '-'*30)print('Test acc:', np.sum(np.argmax(y_pred, 1) == np.argmax(y_test, 1))/y_test.shape[0])img = combine_images(np.concatenate([x_test[:50],x_recon[:50]]))image = img * 255Image.fromarray(image.astype(np.uint8)).save(args.save_dir + "/real_and_recon.png")print()print('Reconstructed images are saved to %s/real_and_recon.png' % args.save_dir)print('-' * 30 + 'End: test' + '-' * 30)plt.imshow(plt.imread(args.save_dir + "/real_and_recon.png"))plt.show()def manipulate_latent(model, data, args):print('-'*30 + 'Begin: manipulate' + '-'*30)x_test, y_test = dataindex = np.argmax(y_test, 1) == args.digitnumber = np.random.randint(low=0, high=sum(index) - 1)x, y = x_test[index][number], y_test[index][number]x, y = np.expand_dims(x, 0), np.expand_dims(y, 0)noise = np.zeros([1, 6, 12])x_recons = []for dim in range(16):for r in [-0.25, -0.2, -0.15, -0.1, -0.05, 0, 0.05, 0.1, 0.15, 0.2, 0.25]:tmp = np.copy(noise)tmp[:,:,dim] = rx_recon = model.predict([x, y, tmp])x_recons.append(x_recon)x_recons = np.concatenate(x_recons)img = combine_images(x_recons, height=12)image = img*255Image.fromarray(image.astype(np.uint8)).save(args.save_dir + '/manipulate-%d.png' % args.digit)print('manipulated result saved to %s/manipulate-%d.png' % (args.save_dir, args.digit))print('-' * 30 + 'End: manipulate' + '-' * 30)def load_mnist():# the data, shuffled and split between train and test sets# the data, shuffled and split between train and test setsX_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()# 将数据归一化,标签one-hotx_train = X_train_orig/255.x_test  = X_test_orig/255.y_train = convert_to_one_hot(Y_train_orig, 6).Ty_test  = convert_to_one_hot(Y_test_orig, 6).Tprint(x_train.shape, y_train.shape)return (x_train, y_train), (x_test, y_test)if __name__ == "__main__":import osimport argparsefrom keras.preprocessing.image import ImageDataGeneratorfrom keras import callbacks# setting the hyper parametersparser = argparse.ArgumentParser(description="Capsule Network on MNIST.")parser.add_argument('--epochs', default=20, type=int)parser.add_argument('--batch_size', default=32, type=int)parser.add_argument('--lr', default=0.001, type=float,help="Initial learning rate")parser.add_argument('--lr_decay', default=0.9, type=float,help="The value multiplied by lr at each epoch. Set a larger value for larger epochs")parser.add_argument('--lam_recon', default=0.392, type=float,help="The coefficient for the loss of decoder")parser.add_argument('-r', '--routings', default=3, type=int,help="Number of iterations used in routing algorithm. should > 0")parser.add_argument('--shift_fraction', default=0.1, type=float,help="Fraction of pixels to shift at most in each direction.")parser.add_argument('--debug', action='store_true',help="Save weights by TensorBoard")parser.add_argument('--save_dir', default='./result')parser.add_argument('-t', '--testing', action='store_true',help="Test the trained model on testing dataset")parser.add_argument('--digit', default=5, type=int,help="Digit to manipulate")parser.add_argument('-w', '--weights', default=None,help="The path of the saved weights. Should be specified when testing")args = parser.parse_args()print(args)if not os.path.exists(args.save_dir):os.makedirs(args.save_dir)# load data(x_train, y_train), (x_test, y_test) = load_mnist()# define modelmodel, eval_model, manipulate_model = CapsNet(input_shape=x_train.shape[1:],n_class=len(np.unique(np.argmax(y_train, 1))),routings=args.routings)model.summary()# train or testif args.weights is not None:  # init the model weights with provided onemodel.load_weights(args.weights)if not args.testing:train(model=model, data=((x_train, y_train), (x_test, y_test)), args=args)else:  # as long as weights are given, will run testingif args.weights is None:print('No weights are provided. Will test using random initialized weights.')manipulate_latent(manipulate_model, (x_test, y_test), args)test(model=eval_model, data=(x_test, y_test), args=args)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手maven的功能/安装/使用/idea集成

看这篇文章不用着急安装&#xff0c;跟着步骤一定会成功&#xff0c;要理解maven是什么&#xff0c;如何使用。 介绍 maven官网 对于一个小白来说&#xff0c;官网有用的信息就是这些 不管如何介绍maven&#xff0c;作为使用者来说&#xff0c;主要感觉两个方面有帮助&#x…

python(16)-列表list,for循环

高级数据类型--列表1列表定义2列表中取值3列表的增&#xff0c;删&#xff0c;查&#xff0c;改3.1修改指定位置的数据3.2确定指定元素的索引3.3增加操作3.4删除操作3.5 元素是否存在与列表中 in3.6在指定索引位置插入元素4列表的数据统计5列表排序6列表的循环遍历-for7多维度l…

深度学习(11)-- GAN

TensorFlow &#xff08;GAN&#xff09; 目录 TensorFlow &#xff08;GAN&#xff09;目录1、GAN1.1 常见神经网络形式1.2 生成网络1.3 新手画家 & 新手鉴赏家1.4 GAN网络1.5 例子 1、GAN 今天我们会来说说现在最流行的一种生成网络, 叫做 GAN, 又称生成对抗网络, 也…

redis——数据结构和对象的使用介绍

redis官网 微软写的windows下的redis 我们下载第一个 额案后基本一路默认就行了 安装后&#xff0c;服务自动启动&#xff0c;以后也不用自动启动。 出现这个表示我们连接上了。 redis命令参考链接 String 字符串结构 struct sdshdr{//记录buf数组中已使用字节的数量int …

Python模块(1)-Argparse 简易使用教程

argparse 简易使用教程1.概况2. action3. argparse 使用demo3.1 argparse 实现加法器3.2 D-Model parser1.概况 argparse是Python中用于解析命令行参数的一个模块&#xff0c;可以自动生成help和usage信息&#xff1b;当从终端输入的参数无效时&#xff0c;模块会输出提示信息…

redis——NOSQL及redis概述

NoSql入门概述 单机Mysql的美好时代 瓶颈&#xff1a; 数据库总大小一台机器硬盘内存放不下数据的索引&#xff08;B tree&#xff09;一个机器的运行内存放不下访问量&#xff08;读写混合&#xff09;一个实例不能承受Memcached&#xff08;缓存&#xff09; MySql 垂直拆…

Python(17)-元组tuple

高级数据类型--元组1.元组的定义2.元组基本操作3.元组的循环遍历4.元组的应用场景5.元组与格式化字符串6.元组与列表之间的转换元组的最大特征就是可访问不可改&#xff0c;可作为字典的键值&#xff0c;因为键值必须是唯一的。字符串也是不可边类型&#xff0c;因此也适合做字…

深度学习(莫烦 神经网络 lecture 3) Keras

神经网络 & Keras 目录 神经网络 & Keras目录1、Keras简介1.1 科普: 人工神经网络 VS 生物神经网络1.2 什么是神经网络 (Neural Network)1.3 神经网络 梯度下降1.4 科普: 神经网络的黑盒不黑1.5 Why Keras?1.6 兼容 backend 2、如何搭建各种神经网络2.1 Regressor回归…

阿里Java编程规约(集合)

【强制】关于 hashCode 和 equals 的处理&#xff0c;遵循如下规则&#xff1a; 1&#xff09; 只要覆写 equals&#xff0c;就必须覆写 hashCode。 2&#xff09; 因为 Set 存储的是不重复的对象&#xff0c;依据 hashCode 和 equals 进行判断&#xff0c;所以 Set 存储的对…

Pytorch(3)-数据载入接口:Dataloader、datasets

pytorch数据载入1.数据载入概况Dataloader 是啥2.支持的三类数据集2.1 torchvision.datasets.xxx2.2 torchvision.datasets.ImageFolder2.3 写自己的数据类&#xff0c;读入定制化数据2.3.1 数据类的编写map-style范式iterable-style 范式2.3.2 DataLoader 导入数据类1.数据载入…

大数据学习(5)-- NoSQL数据库

文章目录目录1.NoSQL的介绍2.NoSQL产生的原因2.1 web2.02.2 NoSQL兴起原因3.NoSQL和关系数据库的区别4.NoSQL的四大类型4.1 键值数据库4.2 列族数据库4.3 文档数据库4.4 图形数据库4.5 不同类型的NoSQL数据库进行比较5.NoSQL的三大基石5.1 CAP5.2 base5.3 最终一致性6.从NoSQL到…

经典算法重点总结

文章目录排序算法冒泡排序直接插入排序希尔排序直接选择排序快速排序堆排序归并排序总结查找算法顺序查找二分查找插值查找斐波那契查找树表查找分块查找哈希查找总结排序算法 冒泡排序 void bubbleSort(int a[] , int n){for(int i n-1 ; i > 0 ; i--){for(int j 0 ; j …

redis——HyperLogLog

HyperLogLog 是一种概率数据结构&#xff0c;用来估算数据的基数。数据集可以是网站访客的 IP 地址&#xff0c;E-mail 邮箱或者用户 ID。 基数就是指一个集合中不同值的数目&#xff0c;比如 a, b, c, d 的基数就是 4&#xff0c;a, b, c, d, a 的基数还是 4。虽然 a 出现两次…

机器学习知识总结系列-机器学习中的优化算法总结(1-4)

文章目录1.梯度下降1.1批量梯度下降(BGD)1.2随机梯度下降&#xff08;SGD&#xff09;1.3 小批量随机梯度下降&#xff08;MSGD&#xff09;1.4 比较&#xff1a;1.5 动量算法&#xff08;momentum&#xff09;1.6 Nestrov Momentum2. 自适应方法2.1 自适应学习率算法&#xff…

Python(19)-字符串、Unicode字符串

高级数据类型--字符串、Unicode字符串1.字符串的定义2.字符串的长度、计数、Index3.字符串常用方法3.1判断类型3.2查找和替换3.3文本对齐3.4去除空白字符.strip()4.字符串的拆分和拼接5.字符串的切片6.跨行字符串7.包含转义字符r8.字符串的分割与连接9.Unicode字符串字符串-不变…

机器学习中的距离和损失函数

文章目录13.1 距离度量13.2 损失函数13.1 距离度量 距离函数种类&#xff1a;欧式距离、曼哈顿距离、明式距离&#xff08;闵可夫斯基距离&#xff09;、马氏距离、切比雪夫距离、标准化欧式距离、汉明距离、夹角余弦等常用距离函数&#xff1a;欧式距离、马氏距离、曼哈顿距离…

Python(20)-高级数据类型的公共方法

高级数据类型的公共方法1内置函数2高级数据类型切片3运算符&#xff0c;*&#xff0c;in4完整的for循环公共方法是列表&#xff0c;元组&#xff0c;字典&#xff0c;字符串都能使用的方法1内置函数 内置函数&#xff1a;不需要import导入模块&#xff0c;就可以直接使用的函数…

redis——为什么选择了跳表而不是红黑树?

跳表是个啥东西请看这个文章。 我们知道&#xff0c;节点插入时随机出一个层数&#xff0c;仅仅依靠一个简单的随机数操作而构建出来的多层链表结构&#xff0c;能保证它有一个良好的查找性能吗&#xff1f;为了回答这个疑问&#xff0c;我们需要分析skiplist的统计性能。 在…

机器学习公式推导

文章目录线性回归逻辑回归线性判别分析PCAk-means决策树svm随机深林GBDTxgboost强化学习MapReduce线性回归 逻辑回归 对于分类问题&#xff1a;输出0/1&#xff0c;超过[0,1]没有意义&#xff0c;使用sigmoid函数 **代价函数&#xff1a;**使用L2平方差&#xff0c;由于模型函…

Python综合应用(1)--名片管理系统开发

第一个综合应用-名片管理系统1框架搭建2完善功能综合应用&#xff0c;名片管理系统 欢迎界面&#xff0c;不同选项&#xff0c;1.新建名片&#xff0c;2.显示全部&#xff0c;3 查询名片&#xff08;查到之后可以修改名片信息&#xff09;&#xff0c;0 退出系统 程序开发流程…