我们可以在不使用keras的情况下在tensorflow2.0中训练模型吗?

我们可以在不使用keras的情况下在tensorflow2.0中训练模型吗?,keras,tensorflow2.0,Keras,Tensorflow2.0,我正在尝试编写一个简单的ML代码,以便在tensorflow2.0中对mnist数据集进行分类。我现在没有使用Keras,因为我只想使用低级API来帮助我理解tensorflow是如何工作的。然而,在我定义了交叉熵之后,它似乎不可能继续。所有tf2.0优化器都移动到了keras,我不知道如何在tf2.0中训练没有keras的模型。有没有办法绕过tf2.0中的keras 来自未来导入绝对导入、除法、打印函数、unicode文本 导入tensorflow作为tf 从tensorflow.keras导

我正在尝试编写一个简单的ML代码,以便在tensorflow2.0中对mnist数据集进行分类。我现在没有使用Keras,因为我只想使用低级API来帮助我理解tensorflow是如何工作的。然而,在我定义了交叉熵之后,它似乎不可能继续。所有tf2.0优化器都移动到了keras,我不知道如何在tf2.0中训练没有keras的模型。有没有办法绕过tf2.0中的keras

来自未来导入绝对导入、除法、打印函数、unicode文本
导入tensorflow作为tf
从tensorflow.keras导入数据集、图层、模型
#助手库
将numpy作为np导入
将matplotlib.pyplot作为plt导入
(列车图像,列车标签),(测试图像,测试标签)=dataset.mnist.load\u data()
打印(序列图像.形状)
打印(透镜(列车标签))
打印(列车图像[1,:,:]形状)
#plt.图()
#plt.imshow(列车图像[0])
#plt.colorbar()
#plt.grid(假)
#plt.show()
#将像素值规格化为介于0和1之间
列车图像,测试图像=列车图像/255.0,测试图像/255.0
W=tf.变量(tf.零([784,10]))
b=tf.变量(tf.零([10]))
对于范围(1)中的i:
x=tf.constant(序列图像[1,:,:]重塑(784),dtype=tf.float32)
x=tf.重塑(x[1784])
打印(tf.形状(x),tf.形状(W))
#定义模型
y=tf.nn.softmax(tf.matmul(x,W)+b)
打印(y)
#正确的标签
y=np.零(10)
y_u[train_标签[i]]=1.0
y=tf.constant(y,dtype=tf.float32)
重塑(y[1,10])
交叉熵=-tf.reduce\u和(y*tf.math.log(y))
打印(交叉熵)
我不知道如何从这里继续下去。

在TensorFlow 2.x中,完全可以使用基于反向传播的模型训练,而无需使用keras API。使用将围绕
tf.GradientTape
API和
tf.optimizers
命名空间下的优化器对象进行

您的示例可以修改如下。请注意,这是一段过于简单的代码,旨在用一段简短的代码片段说明基本用法。这并不是为了说明TF2中的机器学习最佳实践

(列车图像,列车标签),(测试图像,测试标签)=数据集.mnist.load\u数据()
列车图像,测试图像=列车图像/255.0,测试图像/255.0
W=tf.变量(tf.零([784,10]))
b=tf.变量(tf.零([10]))
@功能
def车型年款(x):
#这是一个手动逻辑回归器。
y=tf.matmul(x,W)+b
返回tf.nn.softmax(y)
@功能
def损失(x,y):
#这是一个手动滚动的分类交叉熵损失。
diff=-(标签*tf.math.log(logits))
损失=tf.减少平均值(差异)
回波损耗
优化器=tf.optimizers.Adam(学习率=1e-3)
对于xrange中的i(num_步数):
#一个单一的训练步骤。
使用tf.GradientTape()作为磁带:
#这是不典型的,因为您通常希望在
#小批量,而不是使用x_系列和y_系列中的所有示例
#马上。不过,这只是一个简单的例子。
损耗值=损耗(x\U列、y\U列)
梯度=磁带梯度(损耗值,[W,b])
optimizer.apply_渐变(zip(渐变,[w,b]))