python - 如何正确组织 TensorFlow 模型层?
问题描述
你好世界!我们正在编写自己的 AI,我们努力创建正确的模型层。我们必须在我们的神经网络中输入的是一个list
包含 nlists
和 mtuples
e.x. list = numpy.array([ [[1,2,4],[5,6,8]] , [[5,6,0],[7,2,4]] ])
我们期望得到的结果是 0 或 1(相信我是有道理的)
这就是我们现在所拥有的:
tpl = 3 # because we have tuples
nl = 2 # number of lists we have
model = tf.keras.Sequential([
# this should be entry layer that understands our list
tf.keras.layers.Dense(nl * tpl , input_shape=(nl, tpl), activation='relu'),
#hidden layers..
tf.keras.layers.Dense(64, input_shape=(nl, tpl), activation='sigmoid'),
#our output layer with 2 nodes that one should contain 0, other 1, because we have 2 labels ( 0 and 1 )
tf.keras.layers.Dense(2, input_shape=(0, 1), activation='softmax')
])
但是我们得到以下错误:
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
58 ctx.ensure_initialized()
59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60 inputs, attrs, num_outputs)
61 except core._NotOkStatusException as e:
62 if name is not None:
InvalidArgumentError: Incompatible shapes: [56,2,2] vs. [56,1]
[[node huber_loss/Sub (defined at <ipython-input-25-08eb2e0b395e>:53) ]] [Op:__inference_train_function_45699]
Function call stack:
train_function
如果我们总结我们的模型,它会给出以下结构:
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 2, 6) 24
_________________________________________________________________
dense_2 (Dense) (None, 2, 64) 448
_________________________________________________________________
dense_3 (Dense) (None, 2, 2) 130
=================================================================
最后,
我们了解到的是我们提供的数据与最后一层不兼容,那么我们如何将最后一层转换为 => shape (None, 2)或者解决这个错误的正确方法是什么?
解决方案
您可以使用Flatten()
或GlobalAveragePooling1D
之前的输出层。完整示例:
import numpy
import tensorflow as tf
list = numpy.array([[[1., 2., 4.], [5., 6., 8.]], [[5., 6., 0.], [7., 2., 4.]]])
tpl = 3
nl = 2
model = tf.keras.Sequential([
tf.keras.layers.Dense(nl * tpl, input_shape=(nl, tpl), activation='relu'),
tf.keras.layers.Dense(64, input_shape=(nl, tpl), activation='sigmoid'),
tf.keras.layers.GlobalAveragePooling1D(),
tf.keras.layers.Dense(2, input_shape=(0, 1), activation='softmax')
])
model.build(input_shape=(nl, tpl))
model(list)
<tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[0.41599566, 0.58400434],
[0.41397247, 0.58602756]], dtype=float32)>
你不会只得到 0 和 1,你会得到每个班级的概率。此外,您应该隐藏内置关键字list
。
Model: "sequential_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_12 (Dense) (None, 2, 6) 24
_________________________________________________________________
dense_13 (Dense) (None, 2, 64) 448
_________________________________________________________________
global_average_pooling1d (Gl (None, 64) 0
_________________________________________________________________
dense_14 (Dense) (None, 2) 130
=================================================================
Total params: 602
Trainable params: 602
Non-trainable params: 0
_________________________________________________________________
推荐阅读
- python - 为什么我的 Firebase Firestore 查询不在 order_by 中?
- java - org.hibernate.MappingException:无法确定类型:java.util.List for Hierarchy Ref Cursor 函数结果
- javascript - javascript中的递归和函数调用
- ruby-on-rails - bash:bundle:即使安装了捆绑器,也找不到命令
- java - 对于开发人员,GraalVM 19.3 的 CE 和 EE 版本有什么区别?
- .net-core - 在 .NET Core 2.0 中出现“无法加载文件或程序集”错误
- flutter - 如何使用 Dart/Flutter 在 Cloud Firestore 中存储一个简单的矩阵?
- javascript - 如何合并 2 个不同的对象数组并返回匹配项和不匹配项?
- java - 无法将 Excel 文件中的日期值放入 Web 应用程序表单
- c++ - 如何找到 C++ 虚假复制操作?