我正在尝试为OpenAI健身房实施简单的Q-Network。我有国家的安置者。状态表示为整数。我想要一个单热的矢量。所以,我这样做:
input_state = tf.placeholder(tf.int64, shape=(None))
state_oh = tf.one_hot(input_state, env.observation_space.n)
我正在使用(None
),()
除外,因为我想将批量传递给培训网络。
我预计,state_oh
的形状类似于(None, 16)
,但我得到<unknown>
。这对我来说是一个问题,因为我实现了创建完全连接层的功能,它使用tensor.shape
来确定输入张量的形状:
def dense(x, output_size, activation, name=None):
with tf.name_scope(name, "dense", [x]):
w = tf.Variable(tf.random_normal([input_size, output_size]), name="w")
b = tf.Variable(tf.random_normal([1, output_size]), name="b")
layer = tf.matmul(x, w) + b
layer_act = activation(layer)
return layer_act
这不适用于<unknown>
形状。
如何将一批Integer传递给Tensorflow并获得它的第二维(一个热矢量的长度)?我不希望明确地将输入的大小传递给dense()
。
答案 0 :(得分:1)
我发现,如果我像这样定义我的占位符:
input_state = tf.placeholder(tf.int64, shape=[None], name="input_state")
我犯了一个非常愚蠢的错误。正确的形状为[None]
而不是(None)
,因为(None)
相当于None
,这意味着“任何形状”。
如果占位符的形状正确,则state_oh
的形状将为(?, 16)
。