tensorflow学习

tf中计算图的概念

一个机器学习任务的核心是模型的定义以及模型的参数求解方式,对这两者进行抽象之后,可以确定一个唯一的计算逻辑,将这个逻辑用图表示,称之为计算图。计算图表现为有向无环图,定义了数据的流转方式,数据的计算方式,以及各种计算之间的相互依赖关系等。

  • 节点:
    基于梯度下降求解的机器学习问题,一般分为前向求值和后向求梯度两个过程。其中,前向过程由用户指定,包括模型定义,目标函数、损失函数、激活函数的选取等;后向的计算过程,包括计算梯度,更新梯度等,在优化器中已经由TensorFlow实现,用户不必关心。
    前向图中的节点,根据功能主要分为计算节点(Operation)、存储节点(Variable)和数据节点(Placeholder)3类
    1、Operation:对应无状态的计算或控制操作,主要负责算法逻辑表达或者流程控制。
    2、Variable:对应有状态的变量操作,通常用来存储模型参数。
    3、Placeholder:用于定义输入数据的类型和形状等属性,是对数据的统一抽象。
    后向图中的节点,也可以分为3类,如下:
    1、梯度:迭代过程中,模型参数的梯度。
    2、参数更新操作:根据优化器的优化算法,结合梯度更新相应的模型参数。
    3、更新后的参数:更新后的模型参数,用于模型的下一轮训练。
  • 边:
    计算图中的边是有向边,定义了操作之间的关系,分为两类:一类用来传输数据,称为数据边;另一类用来定义依赖关系,称为控制边。所有的节点都通过数据边或者控制边连接,其中入度为0的节点没有前置依赖,可以立即执行;入度大于0的节点,要等待其依赖的所有节点执行结束之后,才可以执行。
  • 计算图:TensorFlow中可以定义多个计算图,不同计算图上的张量和运算相互独立,因此每一个计算图都是一个独立的计算逻辑。
    1、启动:启动计算图的第一步是创建一个会话(Session)对象,如果没有任何的创建参数,会话构造器将启动默认图。一个Session可以运行多个计算图,一个计算图也可以在多个Session中运行。
    2、运行方式:计算图的运行参考了拓扑排序的思想。
    3、硬件调度:在实现上,TensorFlow 将图形定义转换成分布式执行的操作,以充分利用可用的计算资源(如CPU或GPU)。一般你不需要显式指定使用CPU还是GPU,TensorFlow 能自动检测。如果检测到 GPU,TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作。

tensorflow程序一般分为两个阶段:

1、定义计算图所有的计算

2、在session中执行计算

tf.app.flags()和tf.app.run()

tf.app.flags()具体在tensorflow中我们该怎么使用呢?
首先我们通过tf.app.flags来调用这个flags.py文件,这样我们就可以用flags.DEFINE_interger/float()来添加命令行参数,而FLAGS=flags.FLAGS可以实例化这个解析参数的类从对应的命令行参数取出参数。

  1. import tensorflow as tf
  2. flags = tf.app.flags
  3. flags.DEFINE_string('data_dir', '/tmp/mnist', 'Directory with the MNIST data.')
  4. flags.DEFINE_integer('batch_size', 5, 'Batch size.')
  5. flags.DEFINE_integer('num_evals', 1000, 'Number of batches to evaluate.')
  6. FLAGS = flags.FLAGS
  7. print(FLAGS.data_dir, FLAGS.batch_size, FLAGS.num_evals)

tf.app.run()一般出现在下述代码:

  1. if __name__ == '__main__':
  2. tf.app.run()

上述第一行代码表示如果当前是从其它模块调用的该模块程序,则不会运行main函数!而如果就是直接运行的该模块程序,则会运行main函数。

具体第二行的功能从源码开始分析,源码如下:

flags_passthrough=f._parse_flags(args=args)这里的parse_flags就是我们tf.app.flags源码中用来解析命令行参数的函数。所以这一行就是解析参数的功能;下面两行代码也就是tf.app.run的核心意思:执行程序中main函数,并解析命令行参数!

tf.placehoder,占位符

即必须在执行时feed值。

  1. x = tf.placeholder(tf.float32, [None, 784])
  2. #表示成员类型float32, [None, 784]是tensor的shape, None表示第一维是任意数量,784表示第二维是784维
  3. y_ = tf.placeholder(tf.float32, [None, 10])

tf.sparse_placeholder(dtype, shape, name=None):tf.sparse_placeholder 函数返回一个可以用作提供值的句柄的 SparseTensor,但不能直接计算.

tf.Variable,变量

当训练模型时,用variable来存储和更新参数。用于表示算法迭代过程中的中间参数。
variable实例化时必须有初始值。MNist中,定义w和b:

  1. W = tf.Variable(tf.zeros([784, 10]))
  2. b = tf.Variable(tf.zeros([10]))

tf.Session

Session 是 Tensorflow 为了控制,和输出文件的执行的语句. 运行 session.run() 可以获得你要得知的运算结果, 或者是你所要运算的部分.

  1. import tensorflow as tf
  2. # create two matrixes
  3. matrix1 = tf.constant([[3,3]])
  4. matrix2 = tf.constant([[2],
  5. [2]])
  6. product = tf.matmul(matrix1,matrix2)

因为 product 不是直接计算的步骤, 所以我们会要使用 Session 来激活 product 并得到计算结果. 有两种形式使用会话控制 Session

  1. # method 1
  2. sess = tf.Session()
  3. result = sess.run(product)
  4. print(result)
  5. sess.close()
  6. # method 2
  7. with tf.Session() as sess:
  8. result2 = sess.run(product)
  9. print(result2)

tf.variable_scope()

TensorFlow提供了Variable Scope 这种独特的机制来共享变量。这个机制涉及两个主要函数:

  1. tf.get_variable(<name>, <shape>, <initializer>) 创建或返回给定名称的变量
  2. tf.variable_scope(<scope_name>) 管理传给get_variable()的变量名称的作用域

当前环境的作用域可以通过函数tf.get_variable_scope()获取,并且reuse标志可以通过调用reuse_variables()设置为True,这个非常有用,如下

  1. with tf.variable_scope("foo"):
  2. v = tf.get_variable("v", [1])
  3. tf.get_variable_scope().reuse_variables()
  4. v1 = tf.get_variable("v", [1])
  5. assert v1 is v

作用域中的resuse默认是False,调用函数reuse_variables()可设置为True,一旦设置为True,就不能返回到False,并且该作用域的子空间reuse都是True。如果不想重用变量,那么可以退回到上层作用域,相当于exit当前作用域,如

variable scope的Initializers可以创递给子空间和tf.get_variable()函数,除非中间有函数改变,否则不变。

  1. with tf.variable_scope("foo", initializer=tf.constant_initializer(0.4)):
  2. v = tf.get_variable("v", [1])
  3. assert v.eval() == 0.4 # Default initializer as set above.
  4. w = tf.get_variable("w", [1], initializer=tf.constant_initializer(0.3)):
  5. assert w.eval() == 0.3 # Specific initializer overrides the default.
  6. with tf.variable_scope("bar"):
  7. v = tf.get_variable("v", [1])
  8. assert v.eval() == 0.4 # Inherited default initializer.
  9. with tf.variable_scope("baz", initializer=tf.constant_initializer(0.2)):
  10. v = tf.get_variable("v", [1])
  11. assert v.eval() == 0.2 # Changed default initializer.

算子(ops)会受变量作用域(variable scope)影响,相当于隐式地打开了同名的名称作用域(name scope),如+这个算子的名称为foo/add

  1. with tf.variable_scope("foo"):
  2. x = 1.0 + tf.get_variable("v", [1])
  3. assert x.op.name == "foo/add"

除了变量作用域(variable scope),还可以显式打开名称作用域(name scope),名称作用域仅仅影响算子的名称,不影响变量的名称。另外如果tf.variable_scope()传入字符参数,创建变量作用域的同时会隐式创建同名的名称作用域。

  1. with tf.variable_scope("foo"):
  2. with tf.name_scope("bar"):
  3. v = tf.get_variable("v", [1])
  4. x = 1.0 + v
  5. assert v.name == "foo/v:0"
  6. assert x.op.name == "foo/bar/add"
  • name_scope 对 get_variable新建变量的name属性无影响;对variable新建变量的name属性增加了“范围”标识。
  • variable_scope对get_variable新建变量的name属性和variable新建变量的name属性都增加了“范围”标识。
  • get_variable新建变量如果遇见重复的name则会因为重复而报错。
  • variable新建的变量如果遇见重复的name则会自动修改前缀,以避免重复出现。

tensorflow里面namescope,variable_scope等如何理解? 主要是因为 变量共享 的需求。 而这就不得不谈到tf. get_variable()了。因为如果使用Variable 的话每次都会新建变量,但是大多数时候我们是希望一些变量重用的,所以就用到了get_variable()。它会去搜索变量名,然后没有就新建,有就直接用。 既然用到变量名了,就涉及到了名字域的概念。通过不同的域来区别变量名,毕竟让我们给所有变量都直接取不同名字还是有点辛苦的。所以为什么会有scope 的概念。 name_scope 作用于操作,variable_scope 可以通过设置reuse 标志以及初始化方式来影响域下的变量。 当然对我们而言还有个更直观的感受就是:在tensorboard 里可视化的时候用名字域进行封装后会更清晰 1、对于使用tf.Variable来说,tf.namescope和tf.variable_scope功能一样,都是给变量加前缀,相当于分类管理,模块化。 2、对于tf.get_variable来说,tf.name_scope对其无效,也就是说tf认为当你使用tf.get_variable时,你只归属于tf.variable_scope来管理共享与否。 注意:当多个tf_variable_scope嵌套时,如果中间某层开启了reuse=True, 则内层自动全部共享,即使内层设置了reuse=False。而且,一旦使用tf.get_variable_scope().reuse_variables()打开了当前域共享,就不能关闭了! 1. `tf.variable_scope`和`tf.get_variable`必须要搭配使用(全局scope除外),为share提供支持。 2. `tf.Variable`可以单独使用,也可以搭配`tf.name_scope`使用,给变量分类命名,模块化。 3.  `tf.Variable`和`tf.variable_scope`搭配使用不伦不类,不是设计者的初衷。

tf.reduce_mean()

  1. reduce_mean(input_tensor,
  2. axis=None,
  3. keep_dims=False,
  4. name=None)

第一个参数input_tensor: 输入的待降维的tensor;
第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
第四个参数name: 操作的名称;

  1. import tensorflow as tf
  2. x = [[1,2,3],
  3. [1,2,3]]
  4. xx = tf.cast(x,tf.float32)
  5. mean_all = tf.reduce_mean(xx, keep_dims=False)
  6. mean_0 = tf.reduce_mean(xx, axis=0, keep_dims=False)
  7. mean_1 = tf.reduce_mean(xx, axis=1, keep_dims=False)
  8. with tf.Session() as sess:
  9. m_a,m_0,m_1 = sess.run([mean_all, mean_0, mean_1])
  10. print m_a # output: 2.0
  11. print m_0 # output: [ 1. 2. 3.]
  12. print m_1 #output: [ 2. 2.]
  13. # 如果设置保持原来的张量维度,keep_dims=True
  14. print m_a # output: [[ 2.]]
  15. print m_0 # output: [[ 1. 2. 3.]]
  16. print m_1 #output: [[ 2.], [ 2.]]

类似函数还有:

  • tf.reduce_sum :计算tensor指定轴方向上的所有元素的累加和;
  • tf.reduce_max : 计算tensor指定轴方向上的各个元素的最大值;
  • tf.reduce_all : 计算tensor指定轴方向上的各个元素的逻辑和(and运算);
  • tf.reduce_any: 计算tensor指定轴方向上的各个元素的逻辑或(or运算);

tensorflow中定义Tensor时的参数name有什么用?

  1. # With name
  2. x1 = tf.Variable(0, name="X1")
  3. # Without
  4. one = tf.constant(1)

name参数是可选的(您可以创建带或不带它的变量和常量),并且您在程序中使用的变量不依赖于它。 name在以下几个方面很有帮助:

  • 当想要保存和恢复变量时。 ```python matrix_1 = tf.Variable([[1, 2], [2, 3]], name=”v1”) matrix_2 = tf.Variable([[3, 4], [5, 6]], name=”v2”) init = tf.initialize_all_variables()

saver = tf.train.Saver()

sess = tf.Session() sess.run(init) save_path = saver.save(sess, “/model.ckpt”) sess.close()

  1. - matrix_1matrix_2保存的时候以v1v2保存
  2. - tensorboard中使用name来很好地显示边的名称
  3. ```python
  4. import tensorflow as tf
  5. with tf.name_scope('hidden') as scope:
  6. a = tf.constant(5, name='alpha')
  7. W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')
  8. b = tf.Variable(tf.zeros([1]), name='biases')
  • 您可以将Python命名空间和TensorFlow命名空间想象为两个平行线。 TensorFlow空间中的名称实际上是属于任何TensorFlow变量的“真实”属性,而Python空间中的名称只是在脚本运行期间指向TensorFlow变量的临时指针。 (也就是上面代码中的a, W, b都是在Python空间中定义的变量,而name参数定义的如alpha, weights, biases都是在TensorFlow空间中的)这就是为什么在保存和恢复变量时,只使用TensorFlow名称的原因,因为脚本终止后Python命名空间不再存在,但Tensorflow命名空间仍然存在于保存的文件中。

tensorflow中关于随机数生成种子tf.set_random_seed()

Tensorflow中的随机数生成种子是在数据流图资源上运作的。每一个数据流图中,我们可以执行针对随机数生成种子应用不同的操作(operation)。事实上,随机数生成种子作为random系列函数的参数之一,可在相应的参数列表进行设置,这就是op-level的操作。与之对应的是graph-leveltf.set_random_seed()的操作tf.set_random_seed(),它管理着同一数据流图下的资源。
原文链接:https://blog.csdn.net/qq_31878983/article/details/79495810

tf.tile()

即:通过“平铺”一个给定的 tensor 来构造一个新的 tensor。用人话讲就是:把输入的 tensor,在指定的维度上复制N遍(就像铺瓷砖一样),来创建出一个新的 tensor。
3个参数:
input:输入的tensor
multiples:在指定的维度上复制原tensor的次数
name:operation的名字

  1. import tensorflow as tf
  2. with tf.Session() as sess:
  3. a = tf.constant([[15, 16], [17, 18]])
  4. b = tf.tile(a, [1, 3])
  5. c = tf.tile(a, [3, 2])
  6. print('------------------------------------')
  7. print(sess.run(a))
  8. print('------------------------------------')
  9. print(sess.run(b))
  10. print('------------------------------------')
  11. print(sess.run(c))

tf.fill()

tf.fiil(dims, value, name=None)

参数:

  1. dims: 类型为int32tensor对象,用于表示输出的维度(1-D, n-D),通常为一个int32数组,如:[1], [2,3]等<br /> value: 常量值(字符串,数字等),该参数用于设置到最终返回的tensor对象值中<br /> name: (可选)当前操作别名<br />返回:
  2. tensor对象,类型和value一致

tf.slim()用法

slim中的arg_scope:如果你的网络有大量相同的参数,就可以用arg_scope处理一下。

slim中的repeat和stack操作:repeat可以减少代码量,比如创建几个相同的卷积层。而stack是处理卷积核或者输出不一样的情况。

  1. # 假设定义三个相同的卷积层
  2. net = ...
  3. net = slim.conv2d(net, 256, [3, 3], scope='conv3_1')
  4. net = slim.conv2d(net, 256, [3, 3], scope='conv3_2')
  5. net = slim.conv2d(net, 256, [3, 3], scope='conv3_3')
  6. net = slim.max_pool2d(net, [2, 2], scope='pool2')
  7. # repeat操作:
  8. net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
  9. net = slim.max_pool2d(net, [2, 2], scope='pool2')
  10. # 假设定义三层FC
  11. # Verbose way:
  12. x = slim.fully_connected(x, 32, scope='fc/fc_1')
  13. x = slim.fully_connected(x, 64, scope='fc/fc_2')
  14. x = slim.fully_connected(x, 128, scope='fc/fc_3')
  15. # 使用stack操作:
  16. slim.stack(x, slim.fully_connected, [32, 64, 128], scope='fc')

slim.arg_scope()

  1. with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d],stride = 1, padding = 'VALID'):
  2. net = slim.conv2d(inputs, 32, [3, 3], stride = 2, scope = 'Conv2d_1a_3x3')
  3. net = slim.conv2d(net, 32, [3, 3], scope = 'Conv2d_2a_3x3')
  4. net = slim.conv2d(net, 64, [3, 3], padding = 'SAME', scope = 'Conv2d_2b_3x3')

在使用过程中可以直接slim.conv2d( )等函数设置默认参数。例如在下面的代码中,不做单独声明的情况下,slim.conv2d, slim.max_pool2d, slim.avg_pool2d三个函数默认的步长都设为1,padding模式都是’VALID’的。但是也可以在调用时进行单独声明。这种参数设置方式在构建网络模型时,尤其是较深的网络时,可以节省时间。

tensorflow部分恢复模型

  1. slim.get_variables_to_restore(include=None, exclude=None)

详细可参考:restore的几种方式

tf.multiply()和tf.matmul()

前者是对应元素相乘。

np.maximum,np.minimum

  1. np.maximum(X, Y, out=None)
  2. # example
  3. >> np.maximum([-3, -2, 0, 1, 2], 0)
  4. array([0, 0, 0, 1, 2])

X和Y逐位进行比较,选择最大值.

np.setprintoption()

  1. np.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None)

thredhold:int, optional,当数组数目过大时,设置显示几个数字,其余用省略号(Total number of array elements which trigger summarization rather than full repr (default 1000).)

  1. # 对于输出array时,array中间是省略号而没有输出全部内容的有效解决办法:
  2. np.set_printoptions(threshold=np.inf)

python复杂网络分析库networkx

可以画知识图谱

pandas

  • pd.read_excel()
    sheetname:默认是sheetname为0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe。
    header :指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;若数据不含列名,则设定 header = None
    names:指定列的名字,传入一个list数据
    skiprows:省略指定行数的数据
  • ~运算符相当于取反。
    比如去除面部属性为牙齿异常的数据:loandata_symptom = loandata_symptom[~(loandata_symptom['faceAttribute']=="牙齿异常")]

random.shuffle()

用于将一个列表中的元素打乱

VGGNet

介绍好文

  1. gcn_features: Tensor("graphconvolution_2/SparseTensorDenseMatMul/SparseTensorDenseMatMul:0", shape=(?, 100), dtype=float32)
  2. target_conv_layer: Tensor("InceptionResnetV1/Block8/add:0", shape=(?, 3, 3, 1792), dtype=float32)
  3. image_representation: (?, 1792)
  4. graph_representation: Tensor("graphconvolution_2/SparseTensorDenseMatMul/SparseTensorDenseMatMul:0", shape=(?, 100), dtype=float32)
  5. image_representation_high: 100
  6. graph_representation: Tensor("merge/Reshape:0", shape=(1, 12, 100), dtype=float32)
  7. graph_representation: <class 'tensorflow.python.framework.ops.Tensor'>
  8. graph_representation_copy: (1, 12, 100)
  9. 连接张量
  10. merge_feature: (1, 12, 100)
  11. merge_feature: (1, 100)
  12. net: Tensor("merge/merge_fc1/Relu:0", shape=(1, 50), dtype=float32)
  13. logits: Tensor("merge/res_fc2/BiasAdd:0", shape=(1, 2), dtype=float32)
  14. class_output: Tensor("Max:0", shape=(1,), dtype=float32)
  15. gradient_temp: [<tf.Tensor 'gradients/InceptionResnetV1/Logits/AvgPool_1a_8x8/AvgPool_grad/AvgPoolGrad:0' shape=(?, 3, 3, 1792) dtype=float32>]
  16. target_conv_layer_grad: Tensor("gradients_1/InceptionResnetV1/Logits/AvgPool_1a_8x8/AvgPool_grad/AvgPoolGrad:0", shape=(?, 3, 3, 1792), dtype=float
  17. 32)
  18. gb_grad:Tensor("gradients_2/InceptionResnetV1/Conv2d_1a_3x3/Conv2D_grad/Conv2DBackpropInput:0", shape=(?, 160, 160, 3), dtype=float32)
  19. target_gcn_layer_grad: Tensor("gradients_3/merge/Reshape_grad/Reshape:0", shape=(12, 100), dtype=float32)
  20. target_gcn_grad_input: None
  21. y_c_value [2.3687372]
  22. class_output_value [2.3687372]
  23. 预测结果: [1]
  24. See visualization of below category
  25. image_batch: (1, 160, 160, 3)
  26. target_conv_layer_value: (1, 3, 3, 1792)
  27. target_conv_layer_grad_value: (1, 3, 3, 1792)
  28. nodes_representation_value: (12, 100)
  29. target_gcn_layer_grad_value: (12, 100)
  30. grads_val shape: (3, 3, 1792)
  31. img shape: (160, 160, 3)
  32. image shape: (160, 160, 3)
  33. cam_heatmap1 shape: (160, 160, 3)

05_09_train.py

  1. class_num: 2
  2. test
  3. train
  4. train_image_data: (869, 160, 160, 3)
  5. test_image_data: (226, 160, 160, 3)
  • gpu不能使用,考虑为版本不匹配问题,将tensorflow-gpu从1.9升级到1.13
  • 损失函数可以使用tf.nn.sigmoid_cross_entropy_with_logits
    output使用[n_samples, n_labels]即可

从 result1 和 result2 可以看出,传入 softmax_cross_entropy_with_logits 的 logits 是不需要进行softmax,也就是说 tf 中的 softmax_cross_entropy_with_logits 函数会进行一次 softmax 操作 sparse交叉熵的使用 使用 sparse_softmax_cross_entropy_with_logits 函数, 对于非 one_hot 的标签进行交叉熵计算

问题

1、ggnn.py

  1. 邻接矩阵大小为何是`2*710*710`.
  2. graph_representationattention scores有用吗?

2、【done】 vgg16.py

3、gradcam原理:这样就很好的解决了反卷积和导向反向传播对类别不敏感的问题。当然,Grad-CAM的神奇之处还不仅仅局限在对图片分类的解释上,任何与图像相关的深度学习任务,只要用到了CNN,就可以用Grad-CAM进行解释,如图像描述(Image Captioning),视觉问答(Visual Question Answering)等,所需要做的只不过是把y^c换为对应模型中的那个值即可。

  1. 如何与gcn结合的呢?
  2. **_是否利用了属性标签作为监督信息呢_**,知识又是否作为监督信息了呢?

4、test_online.py中,为何还需要merge_feature2。

5、GCN的batch如何定义?是否需要全图信息才能训练呢?

  1. 针对某个图片,是如何预测的呢?(原始GCN中节点分类是如何预测的呢)

6、test_online_gcn....py中,命令行参数中的distributed_function是干什么用的

  1. `placeholders`中的`labels_mask`什么意思?`support`又是什么意思
  2. `batch_size=1`

7、inception_resnet_v1的end_points返回值什么意思?

新上传的代码中,../dataset文件夹不存在

测试后,lz0017图片的测试质量较好,知识图谱是写死的(根据数据库中标记的图片),我们现场演示时也可这样。

  • ./dataset/test/Beta-thalassemia_normal下所有图片测试如下:
  1. ['gz0001_201906259791.png症状为: β-地中海贫血症', 'GZ0002_201907043169.png症状为: β-地中海贫血症', 'gz0003_201906259109.png症状为: β-地中海贫血症', 'GZ0004_201907119866.png症状为: β
  2. -地中海贫血症', 'GZ0005_201907042717.png症状为: β-地中海贫血症', 'GZ0007_201907175864.png症状为: β-地中海贫血症', 'gz0008_201906274788.png症状为: β-地中海贫血症', 'GZ0009_20190625314
  3. 7.png症状为: β-地中海贫血症', 'gz0010_201907184081.png症状为: β-地中海贫血症', 'gz0011_201907061413.png症状为: β-地中海贫血症', 'gz0012_201907068663.png症状为: β-地中海贫血症', 'GZ0
  4. 013_201907238838.png症状为: β-地中海贫血症', 'gz0016_201907067721.png症状为: β-地中海贫血症', 'gz0017_201906207853.png症状为: β-地中海贫血症', 'gz0018_201906203711.png症状为: β-地中
  5. 海贫血症', 'gz0019_201907028498.png症状为: β-地中海贫血症', 'GZ001B_201907048994.png症状为: 正常', 'GZ001C_201907043874.png症状为: 正常', 'gz0020_201907027097.png症状为: β-地中海贫血
  6. 症', 'GZ0021_201907176861.png症状为: β-地中海贫血症', 'GZ0023_201906254489.png症状为: β-地中海贫血症', 'gz0024_201907271961.png症状为: β-地中海贫血症', 'GZ0024_201907278974.png症状为
  7. : β-地中海贫血症', 'GZ0025_201907115480.png症状为: β-地中海贫血症', 'GZ0026_201907112470.png症状为: β-地中海贫血症', 'GZ0028_201907253858.png症状为: β-地中海贫血症', 'gz0029_2019072
  8. 06942.png症状为: β-地中海贫血症', 'GZ002B_201907259659.png症状为: β-地中海贫血症', 'GZ002C_201907255243.png症状为: β-地中海贫血症', 'GZ0030_201907235168.png症状为: β-地中海贫血症',
  9. 'gz0031_201907201733.png症状为: β-地中海贫血症', 'GZ0032_201907136830.png症状为: 正常', 'gz0033_201907064748.png症状为: β-地中海贫血症', 'GZ0034_201907117502.png症状为: β-地中海贫血
  10. 症', 'gz0035_201907184497.png症状为: β-地中海贫血症', 'gz0036_201907131941.png症状为: β-地中海贫血症', 'gz0037_201907208226.png症状为: β-地中海贫血症', 'GZ0038_201907111484.png症状为
  11. : β-地中海贫血症', 'gz0039_201907186034.png症状为: β-地中海贫血症', 'GZ003B_201907267269.png症状为: β-地中海贫血症', 'GZ003C_201907269908.png症状为: β-地中海贫血症', 'gz0040_2019072
  12. 05521.png症状为: β-地中海贫血症', 'gz0041_201907136844.png症状为: β-地中海贫血症', 'GZ0042_201907113730.png症状为: β-地中海贫血症', 'gz0043_201907202707.png症状为: β-地中海贫血症',
  13. 'GZ0044_201907173924.png症状为: β-地中海贫血症', 'GZ0045_201907136440.png症状为: β-地中海贫血症', 'GZ0046_201907111125.png症状为: β-地中海贫血症', 'gz0047_201907138753.png症状为: β-
  14. 地中海贫血症', 'GZ0048_201907139363.png症状为: 正常', 'GZ0049_201907271571.png症状为: β-地中海贫血症', 'GZ004B_201907303036.png症状为: 正常', 'GZ004C_201907305188.png症状为: β-地中海
  15. 贫血症', 'gz0050_201907256211.png症状为: β-地中海贫血症', 'gz0051_201907235127.png症状为: β-地中海贫血症', 'gz0052_201907138503.png症状为: β-地中海贫血症', 'GZ0053_201907171727.png症
  16. 状为: β-地中海贫血症', 'gz0054_201907231678.png症状为: β-地中海贫血症', 'gz0055_201907232609.png症状为: β-地中海贫血症', 'gz0056_201907201034.png症状为: β-地中海贫血症', 'GZ0057_201
  17. 907138054.png症状为: 正常', 'GZ005B_201907266996.png症状为: β-地中海贫血症', 'GZ005C_201907265683.png症状为: β-地中海贫血症', 'gz0061_201907256710.png症状为: β-地中海贫血症', 'GZ0063
  18. _201907178619.png症状为: β-地中海贫血症', 'gz0064_201907184484.png症状为: β-地中海贫血症', 'GZ0065_201907208892.png症状为: β-地中海贫血症', 'gz0066_201907178901.png症状为: β-地中海
  19. 贫血症', 'gz0067_201907259960.png症状为: β-地中海贫血症', 'GZ0068_201907231772.png症状为: β-地中海贫血症', 'GZ0068_201907238363.png症状为: β-地中海贫血症', 'GZ0069_201907273359.png症
  20. 状为: β-地中海贫血症', 'GZ006B_201907312147.png症状为: β-地中海贫血症', 'GZ006C_201907312545.png症状为: β-地中海贫血症', 'GZ0070_201907259374.png症状为: β-地中海贫血症', 'GZ0071_201
  21. 907319882.png症状为: β-地中海贫血症', 'GZ0072_201907319723.png症状为: β-地中海贫血症', 'GZ007B_201908132548.png症状为: β-地中海贫血症', 'GZ007C_201908134994.png症状为: β-地中海贫血
  22. 症', 'LZ00008_201908151378.png症状为: β-地中海贫血症', 'LZ00010_201908151803.png症状为: β-地中海贫血症', 'LZ0001_201908136873.png症状为: β-地中海贫血症', 'LZ0002_201908139452.png症状
  23. 为: β-地中海贫血症', 'LZ0003_201908133787.png症状为: β-地中海贫血症', 'LZ0004_201908132201.png症状为: β-地中海贫血症', 'LZ0005_201908138806.png症状为: β-地中海贫血症', 'LZ0006_20190
  24. 8131667.png症状为: 正常', 'LZ0006_201908138793.png症状为: β-地中海贫血症', 'LZ0007_201908155793.png症状为: β-地中海贫血症', 'LZ0009_201908155881.png症状为: β-地中海贫血症', 'LZ0011_2
  25. 01908152821.png症状为: β-地中海贫血症', 'LZ0012_201908158807.png症状为: β-地中海贫血症', 'lz0013_201908159035.png症状为: β-地中海贫血症', 'lz0015_201908154389.png症状为: β-地中海贫
  26. 血症', 'lz0016_201908179710.png症状为: β-地中海贫血症', 'lz0017_201908173787.png症状为: β-地中海贫血症', 'lz0018_201908174744.png症状为: β-地中海贫血症', 'lz0019_201908173179.png症状
  27. 为: β-地中海贫血症', 'LZ001B_201908242839.png症状为: β-地中海贫血症', 'LZ001C_201908247612.png症状为: β-地中海贫血症', 'lz0020_201908173281.png症状为: β-地中海贫血症', 'Lz0021_20190
  28. 8176504.png症状为: β-地中海贫血症', 'lz0022_201908177665.png症状为: β-地中海贫血症', 'lz0023_201908178524.png症状为: β-地中海贫血症', 'lz0024_201908179754.png症状为: β-地中海贫血症'
  29. , 'lz0025_201908177996.png症状为: β-地中海贫血症', 'LZ0026_201908201525.png症状为: β-地中海贫血症', 'LZ0027_201908205610.png症状为: β-地中海贫血症', 'lz0028_201908203638.png症状为:
  30. β-地中海贫血症', 'lz0029_201908207163.png症状为: β-地中海贫血症', 'LZ002B_201908248302.png症状为: β-地中海贫血症', 'LZ002C_201908246284.png症状为: β-地中海贫血症', 'LZ0030_201908208
  31. 745.png症状为: β-地中海贫血症', 'lz0031_201908207635.png症状为: β-地中海贫血症', 'lz0032_201908208728.png症状为: β-地中海贫血症', 'lz0033_201908209739.png症状为: β-地中海贫血症', 'L
  32. Z0034_201908201503.png症状为: β-地中海贫血症', 'LZ0035_201908223463.png症状为: 正常', 'LZ0036_201908225570.png症状为: β-地中海贫血症', 'LZ0037_201908229012.png症状为: β-地中海贫血症'
  33. , 'LZ003B_201908285721.png症状为: β-地中海贫血症', 'LZ003C_201908286511.png症状为: β-地中海贫血症', 'LZ004B_201908317421.png症状为: β-地中海贫血症', 'LZ004C_201908314198.png症状为:
  34. 正常', 'lz005b_201908317376.png症状为: β-地中海贫血症', 'LZ005C_201908314597.png症状为: β-地中海贫血症']
  35. β-地中海贫血症', 'LZ002B_201908248302.png症状为: β-地中海贫血症', 'LZ002C_201908246284.png症状为: β-地中海贫血症', 'LZ0030_201908208745.png症状
  36. 为: β-地中海贫血症', 'lz0031_201908207635.png症状为: β-地中海贫血症', 'lz0032_201908208728.png症状为: β-地中海贫血症', 'lz0033_201908209739.png
  37. 症状为: β-地中海贫血症', 'LZ0034_201908201503.png症状为: β-地中海贫血症', 'LZ0035_201908223463.png症状为: 正常', 'LZ0036_201908225570.png症状为:
  38. β-地中海贫血症', 'LZ0037_201908229012.png症状为: β-地中海贫血症', 'LZ003B_201908285721.png症状为: β-地中海贫血症', 'LZ003C_201908286511.png症状
  39. 为: β-地中海贫血症', 'LZ004B_201908317421.png症状为: β-地中海贫血症', 'LZ004C_201908314198.png症状为: 正常', 'lz005b_201908317376.png症状为: β-
  40. 地中海贫血症', 'LZ005C_201908314597.png症状为: β-地中海贫血症']
  1. ![](https://gw.alipayobjects.com/os/lib/twemoji/11.2.0/2/svg/2753.svg#align=left&display=inline&height=18&margin=%5Bobject%20Object%5D&originHeight=150&originWidth=150&status=done&style=none&width=18)但要保证正常人时没有问题,有必要用正常人吗?医生应该只会输入异常病例。

词向量的训练语料和wordnet是否包含中文的表型名。

  1. 词向量是英文的