首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Keras/Tensorflow中使用部分形状的三维稀疏输入给出了误差

在Keras/Tensorflow中使用部分形状的三维稀疏输入给出了误差
EN

Stack Overflow用户
提问于 2022-04-06 17:22:57
回答 1查看 294关注 0票数 1

我试图创建一个密集的神经网络,其中我的输入是一个稀疏的三维矩阵。当转换为稠密矩阵时,形状为(2, None, n) (其中n是许多特性,并且是固定的)。当我使用密集的输入时,我的keras体系结构工作得很好。但是,为了节省内存,我尝试使用稀疏张量作为输入。

这是我的密码

代码语言:javascript
运行
复制
import numpy as np
import tensorflow as tf

input = tf.keras.Input(batch_shape=(2,None,5))
x = tf.keras.layers.Dropout(0.1)(input)
x = tf.keras.layers.Dense(1)(x)

model = tf.keras.models.Model(inputs=[input], outputs=[x])
model.compile(loss='mse')
print(model.summary())

dummy_input = np.random.random((2,10,5))
dummy_sp = tf.sparse.from_dense(dummy_input)

dummy_output= np.random.random((2,10,1))

model.fit(x=dummy_sp, y=dummy_output, epochs=1)

当我使用x=dummy_input时,上面的代码可以正常工作。然而,当我切换到稀疏输入dummy_sp时,我会得到以下错误

代码语言:javascript
运行
复制
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(2, None, 5)]            0

 dropout (Dropout)           (2, None, 5)              0

 dense (Dense)               (2, None, 1)              6

=================================================================
Total params: 6
Trainable params: 6
Non-trainable params: 0
_________________________________________________________________
None
Traceback (most recent call last):
  File "c:\Users\099391\OneDrive\Documents\Projects\NP_E-QSI\srcc\test.py", line 17, in <module>
    model.fit(x=dummy_sp, y=dummy_output, epochs=1)
  File "C:\Users\099391\Anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\099391\Anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py", line 1147, in autograph_handler
    raise e.ag_error_metadata.to_exception(e)
TypeError: in user code:

    File "C:\Users\099391\Anaconda3\lib\site-packages\keras\engine\training.py", line 1021, in train_function  *
        return step_function(self, iterator)
    File "C:\Users\099391\Anaconda3\lib\site-packages\keras\engine\training.py", line 1010, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "C:\Users\099391\Anaconda3\lib\site-packages\keras\engine\training.py", line 1000, in run_step  **
        outputs = model.train_step(data)
    File "C:\Users\099391\Anaconda3\lib\site-packages\keras\engine\training.py", line 859, in train_step
        y_pred = self(x, training=True)
    File "C:\Users\099391\Anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
        raise e.with_traceback(filtered_tb) from None

    TypeError: Exception encountered when calling layer "dropout" (type Dropout).

    Failed to convert elements of SparseTensor(indices=Tensor("DeserializeSparse:0", shape=(None, 3), dtype=int64), values=Tensor("model/Cast:0", shape=(None,), dtype=float32), dense_shape=Tensor("stack:0", shape=(3,), dtype=int64)) to Tensor. Consider casting elements to a supported type. See https://www.tensorflow.org/api_docs/python/tf/dtypes for supported TF dtypes.

    Call arguments received:
      • inputs=<tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x000002423CD78E20>
      • training=True
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-06 17:48:25

基于tf-文件,即使将sparse参数设置为False,只要输入数据是稀疏矩阵,仍然可以传递sparse张量。

稀疏:指定要创建的占位符是否稀疏的布尔值。只有“衣衫褴褛”和“稀疏”中的一个才是真实的。注意,如果稀疏是假的,稀疏张量仍然可以传递到输入--它们将被加密,默认值为0.

代码语言:javascript
运行
复制
input = tf.keras.Input(batch_shape=(2,None,5), sparse=False)
x = tf.keras.layers.Dropout(0.1)(input)
x = tf.keras.layers.Dense(1)(x)
model = tf.keras.models.Model(inputs=[input], outputs=[x])
print(model.summary())
# OK 

更新

基于下面的评论。

代码语言:javascript
运行
复制
class toDense(keras.layers.Layer):
    def call(self, input):
        if isinstance(input, tf.sparse.SparseTensor):
            return tf.sparse.to_dense(input)
        return input

将其放置在Input之后和上述模型的Dropout层之前。喜欢,

代码语言:javascript
运行
复制
input = tf.keras.Input(batch_shape=(2,None,5))
x = toDense()(input)
x = tf.keras.layers.Dropout(0.1)(x)
...

接下来,你可以

代码语言:javascript
运行
复制
dummy_input = np.random.random((2,10,5))
dummy_sp = tf.sparse.from_dense(dummy_input)
dummy_output= np.random.random((2,10,1))

model(dummy_sp).shape 
>> TensorShape([2, 10, 1])

model.compile(loss='mse')
model.fit(x=dummy_sp, y=dummy_output, epochs=1)
1/1 [=====] - 0s 416ms/step - loss: 0.2746
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71771137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档