TensorFlow 和 Keras 入门:过去 (TF1) 现在 (TF2)

2024-04-06

这个问题的目的是要求一个最基本的指南来帮助人们快速了解 TensorFlow 1 和 TensorFlow 2。我觉得没有一个连贯的指南来解释 TF1 和 TF2 之间的差异,并且 TF 已经通过了主要的研究修订和快速发展。

当我说时供参考,

  • v1 或 TF1 - 我指的是 TF 1.15.0
  • v2 或 TF2 - 我指的是 TF 2.0.0

我的问题是,

  • TF1/TF2 如何工作?他们的主要区别是什么?

  • TF1 和 TF2 中有哪些不同的数据类型/数据结构?

  • Keras 是什么?它如何适应所有这些? Keras 提供了哪些不同的 API 来实现深度学习模型?您能分别举出一些例子吗?

  • 使用 TF 和 Keras 时需要注意的最常见的警告/错误是什么?

  • TF1 和 TF2 之间的性能差异


TF1/TF2 如何工作?还有他们的区别

TF1

TF1 遵循称为“定义然后运行”的执行风格。这与“按运行定义”相反,后者是 Python 执行风格。但是,这是什么意思?定义然后运行意味着,仅仅因为您调用/定义了某些内容,它就不会被执行。您必须明确执行您定义的内容。

TF有这样一个概念Graph。首先,定义所需的所有计算(例如,神经网络的所有层计算、损失计算和最小化损失的优化器 - 这些表示为ops or 运营)。定义计算/数据流图后,您可以使用Session。让我们看一个简单的实际例子。

# Graph generation
tf_a = tf.placeholder(dtype=tf.float32)
tf_b = tf.placeholder(dtype=tf.float32)
tf_c = tf.add(tf_a, tf.math.multiply(tf_b, 2.0))

# Execution
with tf.Session() as sess:
    c = sess.run(tf_c, feed_dict={tf_a: 5.0, tf_b: 2.0})
    print(c)

计算图(也称为数据流图)如下所示。

     tf_a      tf_b   tf.constant(2.0)
       \         \   /
        \      tf.math.multiply
         \     /
         tf.add
            |
          tf_c

Analogy: 想想你正在做蛋糕。您从互联网上下载食谱。然后你就开始按照步骤实际制作蛋糕。食谱就是图表,制作蛋糕的过程就是会话所做的事情(即图表的执行)。

TF2

TF2 遵循立即执行风格或按运行定义。你调用/定义一些东西,它就会被执行。让我们看一个例子。

a = tf.constant(5.0)
b = tf.constant(3.0)
c = tf_a + (tf_b * 2.0)
print(c.numpy())

哇!与 TF1 示例相比,它看起来非常干净。一切看起来都很Pythonic。

Analogy:现在想象一下您正在一个亲自动手制作蛋糕的工作坊中。您正在按照教练的说明制作蛋糕。讲师会立即解释每一步的结果是什么。因此,与前面的示例不同,您不必等到烤蛋糕才知道是否正确(这是指您无法调试代码)。但你会得到关于你的表现的即时反馈(你知道这意味着什么)。

这是否意味着 TF2 不构建图表?惊恐发作

嗯,是的,也不是。 TF2 有两个你应该了解的功能急于执行 https://www.tensorflow.org/guide/eager and 签名 https://www.tensorflow.org/guide/function功能。

Tip:确切地说,TF1 也具有急切执行功能(默认情况下关闭),并且可以使用以下命令启用tf.enable_eager_execution()。 TF2 默认情况下启用 eager_execution。

热切的执行力

Eager Execution 可以立即执行Tensors and Operations。这就是您在 TF2 示例中观察到的情况。但另一方面是它不构建图表。因此,例如,您使用急切执行来实现和运行神经网络,它会非常慢(因为神经网络一遍又一遍地执行非常重复的任务(前向计算 - 损失计算 - 后向传递))。

签名

这就是 AutoGraph 功能可以发挥作用的地方。 AutoGraph 是 TF2 中我最喜欢的功能之一。它的作用是,如果您在函数中执行“TensorFlow”操作,它会分析该函数并为您构建图表(心碎)。例如,您执行以下操作。 TensorFlow 构建图表。

@tf.function
def do_silly_computation(x, y):
    a = tf.constant(x)
    b = tf.constant(y)
    c = tf_a + (tf_b * 2.0)
    return c

print(do_silly_computation(5.0, 3.0).numpy())

因此,您需要做的就是定义一个函数,它接受必要的输入并返回正确的输出。最重要的是添加@tf.function装饰器,因为它是 TensorFlow AutoGraph 分析给定函数的触发器。

Warning:AutoGraph 不是灵丹妙药,不要天真地使用。有各种局限性 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/autograph/g3doc/reference/limitations.mdAutoGraph 也是如此。

TF1 和 TF2 之间的区别

  • TF1 需要一个tf.Session()对象来执行图形,而 TF2 则不会
  • 在 TF1 中,Python GC 不收集未引用的变量,但在 TF2 中,它们是
  • TF1 不会促进代码模块化,因为您需要在开始计算之前定义完整的图。然而,使用 AutoGraph 功能代码模块化是受到鼓励的

TF1 和 TF2 中有哪些不同的数据类型?

您已经了解了许多主要数据类型。但您可能对他们的工作和行为方式有疑问。嗯,本节就是关于这些的。

TF1 数据类型/数据结构

  • tf.placeholder:这就是向计算图提供输入的方式。顾名思义,它没有附加值。相反,您在运行时提供一个值。tf_a and tf_b就是这些例子。将其视为一个空盒子。根据需要,您可以在其中填充水/沙子/毛茸茸的泰迪熊。

  • tf.Variable:这是您用来定义神经网络参数的内容。与占位符不同,变量是用某个值初始化的。但它们的价值也会随着时间而改变。这就是反向传播过程中神经网络参数发生的情况。

  • tf.Operation:操作是可以对占位符、张量和变量执行的各种转换。例如tf.add() and tf.mul()是操作。这些操作返回一个张量(大多数时候)。如果您想要不返回张量的操作的证明,请检查this https://www.tensorflow.org/api_docs/python/tf/no_op out.

  • tf.Tensor:这类似于变量,因为它有一个初始值。然而,一旦定义了它们,它们的值就不能改变(即它们是不可变的)。例如,tf_c在前面的例子中是一个tf.Tensor.

TF2 数据类型/数据结构

  • tf.Variable
  • tf.Tensor
  • tf.Operation

就行为而言,从 TF1 到 TF2 的数据类型没有太大变化。唯一的主要区别是,tf.placeholders消失了。您还可以查看数据类型的完整列表 https://www.tensorflow.org/api_docs/python/tf/dtypes/DType.

Keras 是什么?它如何适应所有这些?

Keras 曾经是一个独立的库,提供主要用于深度学习模型的组件(例如层和模型)的高级实现。但从 TensorFlow 的更高版本开始,Keras 就集成到了 TensorFlow 中。

正如我所解释的,Keras 隐藏了许多不必要的复杂问题,如果您要使用裸机 TensorFlow,则必须处理这些问题。 Keras 提供了两个主要功能Layer物体和Model实现神经网络的对象。 Keras 还具有两个最常见的模型 API,可让您开发模型:顺序API函数式API。让我们通过一个简单的示例来看看 Keras 和 TensorFlow 有什么不同。让我们构建一个简单的 CNN。

Tip:Keras 可以让您更轻松地实现使用 TF 所能实现的目标。但 Keras 还提供了 TF 中尚不强大的功能(例如文本处理 https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/text/Tokenizer能力)。

height=64
width = 64
n_channels = 3
n_outputs = 10

Keras(顺序 API)示例

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(2,2), 
activation='relu',input_shape=(height, width, n_channels)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64, kernel_size=(2,2), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam')
model.summary()

Pros

直接实现简单模型

Cons

不能用于实现复杂模型(例如具有多个输入的模型)

Keras(函数式 API)示例

inp = Input(shape=(height, width, n_channels))
out = Conv2D(filters=32, kernel_size=(2,2), activation='relu',input_shape=(height, width, n_channels))(inp)
out = MaxPooling2D(pool_size=(2,2))(out)
out = Conv2D(filters=64, kernel_size=(2,2), activation='relu')(out)
out = MaxPooling2D(pool_size=(2,2))(out)
out = Flatten()(out)
out = Dense(n_outputs, activation='softmax')(out)
model = Model(inputs=inp, outputs=out)
model.compile(loss='binary_crossentropy', optimizer='adam')
model.summary()

Pros

可用于实现涉及多个输入和输出的复杂模型

Cons

需要很好地理解输入输出的形状以及每层的预期输入是什么

TF1 示例

# Input
tf_in = tf.placeholder(shape=[None, height, width, n_channels], dtype=tf.float32)

# 1st conv and max pool
conv1 = tf.Variable(tf.initializers.glorot_uniform()([2,2,3,32]))
tf_out = tf.nn.conv2d(tf_in, filters=conv1, strides=[1,1,1,1], padding='SAME') # 64,64
tf_out = tf.nn.max_pool2d(tf_out, ksize=[2,2], strides=[1,2,2,1], padding='SAME') # 32,32

# 2nd conv and max pool
conv2 = tf.Variable(tf.initializers.glorot_uniform()([2,2,32,64]))
tf_out = tf.nn.conv2d(tf_out, filters=conv2, strides=[1,1,1,1], padding='SAME') # 32, 32
tf_out = tf.nn.max_pool2d(tf_out, ksize=[2,2], strides=[1,2,2,1], padding='SAME') # 16, 16
tf_out = tf.reshape(tf_out, [-1, 16*16*64])

# Dense layer
dense = conv1 = tf.Variable(tf.initializers.glorot_uniform()([16*16*64, n_outputs]))
tf_out = tf.matmul(tf_out, dense)

Pros

非常适合涉及非典型操作的前沿研究(例如动态改变层的大小)

Cons

可读性差

注意事项和陷阱

这里我将列出一些使用 TF 时需要注意的事项(来自我的经验)。

TF1 - 忘记提供所有依赖占位符来计算结果

tf_a = tf.placeholder(dtype=tf.float32)
tf_b = tf.placeholder(dtype=tf.float32)
tf_c = tf.add(tf_a, tf.math.multiply(tf_b, 2.0))

with tf.Session() as sess:
    c = sess.run(tf_c, feed_dict={tf_a: 5.0})
    print(c)

InvalidArgumentError:您必须使用 dtype float 为占位符张量“Placeholder_8”提供值 [[节点 Placeholder_8 (定义于 /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py:1748)]]

您在这里收到错误的原因是因为您没有向tf_b。因此,请确保您将价值观提供给all用于计算结果的依赖占位符。

TF1 - 对数据类型要非常小心

tf_a = tf.placeholder(dtype=tf.int32)
tf_b = tf.placeholder(dtype=tf.float32)
tf_c = tf.add(tf_a, tf.math.multiply(tf_b, 2.0))

with tf.Session() as sess:
    c = sess.run(tf_c, feed_dict={tf_a: 5, tf_b: 2.0})
    print(c)

类型错误:“Add”Op 的输入“y”的类型为 float32,与参数“x”的 int32 类型不匹配。

你能发现错误吗?这是因为在将数据传递给操作时必须匹配数据类型。否则,使用tf.cast()将数据类型转换为兼容数据类型的操作。

Keras - 了解每层期望的输入形状

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(2,2), 
activation='relu',input_shape=(height, width)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64, kernel_size=(2,2), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam')

ValueError:层 conv2d_8 的输入 0 与该层不兼容:预期 ndim=4,发现 ndim=3。收到的完整形状:[无、64、64]

在这里,您定义了输入形状[None, height, width](当您添加批次维度时)。但Conv2D需要 4D 输入[None, height, width, n_channels]。因此你会得到上面的错误。一些常见的被误解/容易出错的层是,

  • Conv2D层 - 需要 4D 输入[None, height, width, n_channels]。要更详细地了解卷积层/操作,请查看此内容answer https://stackoverflow.com/questions/42883547/intuitive-understanding-of-1d-2d-and-3d-convolutions-in-convolutional-neural-n/59099278#59099278
  • LSTM层 - 需要 3D 输入[None, timesteps, n_dim]
  • ConvLSTM2D层 - 需要 5D 输入[None, timesteps, height, width, n_channels]
  • Concatenate层 - 除轴外,所有其他维度上连接的数据需要相同

Keras - 期间输入错误的输入/输出形状fit()

height=64
width = 64
n_channels = 3
n_outputs = 10

Xtrain = np.random.normal(size=(500, height, width, 1))
Ytrain = np.random.choice([0,1], size=(500, n_outputs))

# Build the model

# fit network
model.fit(Xtrain, Ytrain, epochs=10, batch_size=32, verbose=0)

ValueError:检查输入时出错:预期 conv2d_9_input 的形状为 (64, 64, 3),但得到的数组的形状为 (64, 64, 1)

你应该知道这个。我们正在输入形状的输入[batch size, height, width, 1]当我们应该喂食时[batch size, height, width, 3] input.

TF1 和 TF2 之间的性能差异

这已经在讨论了here https://stackoverflow.com/questions/58441514/why-is-tensorflow-2-much-slower-than-tensorflow-1。所以我不会重复里面的内容。

我希望可以谈论但不能谈论的事情

我留下了一些进一步阅读的链接。

  • tf.data.Dataset https://www.tensorflow.org/api_docs/python/tf/data/Dataset
  • tf.RaggedTensor https://www.tensorflow.org/guide/ragged_tensor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow 和 Keras 入门:过去 (TF1) 现在 (TF2) 的相关文章

  • 使用notebook时将jar添加到pyspark

    我正在尝试将 mongodb hadoop 与 Spark 集成 但不知道如何使 IPython 笔记本可以访问这些 jar 这是我想做的 set up parameters for reading from MongoDB via Had
  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • 为什么最新的 Python 3.8.x 版本不提供 Windows 安装程序?

    我需要在Windows计算机上安装Python 3 8并希望使用最新的小版本3 8 12 https www python org downloads release python 3812 官方发布网页提供了源代码的 tarball 文件
  • 如何在Python中检查UDF函数中pyspark数据帧列的单元格值为none或NaN以实现前向填充?

    我基本上是在尝试进行前向填充插补 下面是代码 df spark createDataFrame 1 1 None 1 2 5 1 3 None 1 4 None 1 5 10 1 6 None session timestamp id PR
  • 如何在模型 Django 中创建必需:布尔字段

    我有一个模型 其中有一个名为的字段is student and is teacher Student and Teacher forms is teacher models BooleanField teacher status defau
  • 为什么 np.linalg.norm(..., axis=1) 比写出向量范数公式慢?

    标准化矩阵的行X对于单位长度 我通常使用 X np linalg norm X axis 1 keepdims True 在尝试优化算法的此操作时 我非常惊讶地发现在我的机器上写出标准化的速度大约快了 40 X np sqrt X 0 2
  • 简单 CAE 的问题

    看起来简单的 CAE 不适用于 Carvana 数据集 我正在尝试对 Carvana 数据集进行简单的 CAE 你可以下载它here https www kaggle com c carvana image masking challeng
  • 将Python嵌入到C中——导入模块

    我在使用嵌入式 Python for C 时遇到问题文档 http docs python org extending embedding html 每当我尝试使用导入的模块时 我都会得到 PythonIncl exe 中 0x1e089e
  • 如果工作表不存在,Pandas 将工作表附加到工作簿,否则覆盖工作表

    我正在使用 pandas 更新现有的 Excel 工作簿 当使用ExcelWriter对象 我可以覆盖工作表 如果存在 否则创建一个新工作表吗 我的代码附加了新工作表 但是当我尝试覆盖现有工作表时 它会附加一个名称略有不同的新工作表 例如
  • Tensorflow:Cuda 计算能力 3.0。所需的最低 Cuda 能力为 3.5

    我正在从源安装tensorflow 文档 https www tensorflow org versions r0 10 get started os setup html installing from sources Cuda驱动版本
  • Python 日志记录 - 如何检查记录器是否为空

    我刚刚在我的应用程序中实现了日志记录 我想知道是否有一种方法可以检查记录器是否为空 我的想法是在我的脚本中设置两个处理程序 一个用于带水平仪的控制台WARNING 一个用于带级别的文件DEBUG 在脚本的最后 我需要检查是否CONSOLE记
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • 在 CSV 文件的最上面一行写入

    我有这个sample csv 文件 a 1 apple b 2 banana c 3 cranberry d 4 durian e 5 eggplant 并有以下代码 samplefile open sample csv rb rows s
  • 打包布尔数组需要通过 int (numpy 1.8.2)

    我正在寻找更紧凑的方式来存储布尔值 numpy 内部需要 8 位来存储一个布尔值 但是np packbits允许打包 他们 这真是太酷了 问题是要打包在4e6字节数组a32e6字节我们需要首先使用的布尔值数组256e6字节将布尔数组转换为
  • Python,质数检查器[重复]

    这个问题在这里已经有答案了 你好 我正在创建一个函数来检查一个数字是否是素数 但它告诉我 9 是一个素数 def eprimo num if num lt 2 return False if num 2 return True else f
  • 编写 CherryPy 装饰器以进行授权

    我有一个cherrypy应用程序 在某些视图上我想开始只允许某些用户查看它们 并将其他任何人发送到需要授权的页面 有没有办法使用自定义装饰器来做到这一点 我认为这将是最优雅的选择 这是我想做的一个基本示例 class MyApp autho
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • Django 表单中的只读字段

    如何在 Django 表单中将字段设置为只读 我知道如何禁用某个字段 但这不是我想要的 任何帮助 将不胜感激 您可以使用可选的attrs定义时的参数Field 以机智 somefield forms CharField widget for
  • 根据键的重复值从列表中删除字典

    我是Python新手 假设我有以下字典列表 mydictList a 1 b 2 c 3 a 2 b 2 c 4 a 2 b 3 c 4 从上面的列表中 我想删除具有相同键 b 值的字典 所以结果列表应该是 mydictList a 1 b

随机推荐

  • Python3.3类型=文件名错误

    import sys import argparse parser argparse ArgumentParser description blah blah parser add argument reference file type
  • iOS 4 阻止并保留计数

    我刚刚开始使用街区和 Grand Central Dispatch 有人告诉我 并在苹果文档 http developer apple com library ios documentation cocoa Conceptual Block
  • 在 Angular 中发生 httpClient 超时时调用函数 [重复]

    这个问题在这里已经有答案了 我有一个函数在服务器上发送一些超时请求 每个请求如下 this httpClient get url headers headers timeout 30000 subscribe response gt err
  • 使用 PHP 的 DateTime 类验证有效日期

    以下是我之前验证日期的方法 我也有自己的函数来转换日期格式 但是 现在使用 PHP 的 DateTime 类 因此不再需要它们 我应该如何最好地使用 DataTime 验证有效日期 还请告诉我您是否认为我应该首先使用 DataTime 谢谢
  • 为什么Cocoa里没有队列?

    我最近发现 Cocoa 中没有内置队列 在本例中为 Touch 为什么不 队列是计算机编程中最基本的数据结构之一 我看到有人建议使用NSMutableArray 但这对于弹出 出列来说效率极低 因为它需要删除索引 0 处的对象 这会将所有元
  • django:预取 GenericForeignKey 的相关对象

    假设我有一个模型Box with a GenericForeignKey指向任一Apple实例或Chocolate实例 Apple and Chocolate 反过来 有外键Farm and Factory 分别 我想显示一个列表Boxes
  • Swift 4 用变量作为键解析 json [重复]

    这个问题在这里已经有答案了 我试图了解苹果添加的新 Codable 功能 但我无法解决这个问题 我有一个 json 输出 如下所示 Afpak id 1 race hybrid flavors Earthy Chemical Pine ef
  • 无法找到请求的.Net Framework 数据提供程序 - SQLite

    我认为 sqlite 很简单 但它给我带来了困难 我只想创建一个可以使用 ado net 实体数据类连接到 sqlite 数据库的应用程序 我在运行 Windows XP 的虚拟计算机上测试应用程序时遇到此问题 该应用程序在我当前的计算机以
  • iOS 内存管理——其他进程 RAM 增加

    我有一个使用几个的应用程序UIViewControllers with SKScenes里面有一些大图像和ObjectAL http kstenerud github io ObjectAL for iPhone 对于声音 按下几个视图控制
  • 调用超级构造函数

    我有一个自定义异常类 如下所示 case class CustomException errorMsg String extends Exception error String 当我捕获异常时 我所需要的就是抛出自定义异常并将错误消息传递
  • 将数组转换为链接列表 - 来自 Eloquent Javascript

    这是书中我无法理解的挑战之一 或者我的大脑无法分解它 这是解决函数 function arrayToList array var list null for var i array length 1 i gt 0 i list value
  • 如何检查调用堆栈

    是否可以看到CallStackMS Access 2003 的 VBA 中 也就是说 是不是可以从什么看出procedure or function其他function被称为 运行时 查看菜单 gt 调用堆栈 或按 CTRL L
  • XSL:避免将命名空间定义导出到生成的 XML 文档

    我想从一些 XML 文件中获取数据并将它们转换为新的 XML 文档 但是 我不希望 XSLT 中命名空间的定义出现在结果文档中 换句话说 source
  • ng-if - 检查空值

    我有一个循环遍历数据集并确定 href 的文件夹设置 我对每个选项都有一个 ng if 但我需要对其中一个 ng if 添加检查 我需要一种方法来检查值是否为空 我用过类似的东西 ng if shortcut SAM3Link 这样做的问题
  • 关联查询:select where条件不是max(内部查询中的条件)

    我试图选择 userName 和 groupId 重复的所有行 并且 userId 不是该 userName groupId 组合的最大 userId 到目前为止 这是我的代码 select from userTable u where e
  • 如何在linux终端上一行编译并运行?

    每次编译并运行 c 文件时 我都必须输入 gcc 文件名 c a out 我不想用两行来完成此操作 如何在linux终端上用一行来编译和运行 Try gcc filename c a out 如果第一个命令成功 它仅运行第二个命令 看htt
  • 想要通过 Activity android 来运行和停止服务

    我想知道是否可以做到这一点 我想实现一个服务 该服务将在活动启动时调用 并应定期运行 当我通过关闭或按回按钮来停止活动时 该服务应停止 并且警报管理器不应调用活动重新开始前的服务 我还想发送一些服务可以运行的数据并将结果返回给活动 目前我正
  • 有没有办法以编程方式读取/访问 Android 中的电子邮件或收件箱?

    有没有办法以编程方式读取 访问 Android 中的电子邮件或收件箱 据我所知 无法通过默认的 Gmail 应用程序以编程方式访问电子邮件 您最好的选择是找到一些 POP 或 IMAP 库 并将其集成到您的应用程序中 通过输入他们的电子邮件
  • Powershell Salesforce SOAP API SessionHeader 类型转换问题

    您好 我在设置 SessionHeaderValue 时遇到问题 我的代码基于 c Net 登录正常 我在登录结果中收到 serviceUrl 和 sessionId 但无法获取会话标头中设置的会话 ID 这是代码 uri c instal
  • TensorFlow 和 Keras 入门:过去 (TF1) 现在 (TF2)

    这个问题的目的是要求一个最基本的指南来帮助人们快速了解 TensorFlow 1 和 TensorFlow 2 我觉得没有一个连贯的指南来解释 TF1 和 TF2 之间的差异 并且 TF 已经通过了主要的研究修订和快速发展 当我说时供参考