为了账号安全,请及时绑定邮箱和手机立即绑定

为什么必须在 Keras/张量流 2 中重塑输入?

为什么必须在 Keras/张量流 2 中重塑输入?

慕姐8265434 2022-09-13 17:50:35
我有一个简单的网络:input_layer = Input(1)inner_layer = Dense(4, activation='relu')(input_layer)output_layer = Dense(1, activation='linear')(inner_layer)model = Model(input_layer, output_layer)optimizer = Adam(learning_rate=0.01)model.compile(optimizer=optimizer, loss='mse')直观地说,对输入的推断将只是 。但是,这会生成此错误:0model.predict(0)expected input_2 to have 2 dimensions, but got array with shape ()我知道它期望输入(这是一个单个数字)是二维的,但我不明白Tensorflow接受什么作为有效输入。我尝试了许多不同的输入组合,有些有效,有些不起作用,它似乎非常不一致,警告/错误通常没有用:呼叫时 :model.predict()model.predict(0)- 投掷model.predict([0]) - 工程model.predict([[0]]) - 工程调用时(我在这里看到需要获取渐变):model()model(0)- 投掷model([0])- 投掷model([[0]])- 投掷使用时:np.reshapemodel(np.reshape(0,[1,1])) - 工程model(np.reshape([0],[1,1])) - 工程model(np.reshape([[0]],[1,1])) - 工程似乎一直在工作的是使用numpy的功能。它始终适用于所有输入,只要它们被重塑为形状即可。reshapemodel.predict()model()[1,1]我的问题:在输入形状/类型方面,将输入馈送到张量流模型中的准则是什么?“”是什么意思?shape ()“”是什么意思?(None, 1)为什么有效但无效?两者都创建一个二维集合。reshape[[0]]为什么在调用 // 时,此警告显示: ?model(0)model([0])model([[0]])WARNING:tensorflow:Model was constructed with shape Tensor("input_1:0", shape=(None, 1), dtype=float32) for input (None, 1), but it was re-called on a Tensor with incompatible shape ()
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

张量的形状是 (运行 )。表示动态确定的任何大小(批大小)。是数据点的形状。例如,这是形状的张量:inputs = tf.keras.layers.Input(1)(None, 1)inputs.get_shape().as_list()None1(3, 1)


[[1], [2], [1]]

这是形状的张量(3,)


[1, 2, 1]

如果定义形状的张量,则必须提供相同形状的数据。(None, 1)


具有正确的形状,如果将其作为预期数据类型的 numpy 数组传递,则不会引发任何错误或警告:[[0]](1, 1)


import tensorflow as tf

import numpy as np


input_layer = tf.keras.layers.Input(1)

inner_layer = tf.keras.layers.Dense(4, activation='relu')(input_layer)

output_layer = tf.keras.layers.Dense(1, activation='linear')(inner_layer)

model = tf.keras.models.Model(input_layer, output_layer)

optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)

model.compile(optimizer=optimizer, loss='mse')

print(model(np.array([[0.]], dtype=np.float32)).numpy()) # [[0.]]

print(model.predict(np.array([[0.], [1]], dtype=np.float32))) # [[0.        ]

                                                              # [0.08964952]]

np.reshape()工作,因为它会自动将您的列表转换为numpy数组。有关详情,请参阅官方文档。np.reshape


还需要与 相同的形状,但可以执行自动整形(在左侧扩展尺寸,即 )。model.predict()model.__call__()[1] -- > [[1]]


查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 54 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信