gpt4 book ai didi

python - 在 Keras 中制作采样层

转载 作者:行者123 更新时间:2023-12-04 07:47:56 25 4
gpt4 key购买 nike

我正在尝试构建一个自定义 Keras 层,该层返回从先前 softmax 层中选择的类的一个热向量,即,如果 Sofmax 层返回 [0.4 0.1 0.5] 我想根据这个 softmax 概率。
这是我到目前为止所做的:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import utils



def sampling(x):

# HERE: I need to input 'x' into the 'tf.math.log' function, but after trying it created an error

samples = tf.random.categorical(tf.math.log([[0.4 0.1 0.5]]), 1) # samples should be like [[z]] with z a number between 0 and 2

return utils.to_categorical(samples[0][0], num_classes=3)



x = keras.Input(shape=(1,1,))

x, _, _ = layers.LSTM(100, return_sequences=True, return_state=True)(x)

x = layers.Dense(3, activation="softmax")(x)

x = layers.Lambda(sampling)(x)
此代码返回:

/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/utils/np_utils.pyin to_categorical(y, num_classes, dtype)6768 """---> 69 y = np.array(y, dtype='int')70 input_shape = y.shape71 if input_shape and input_shape[-1] == 1 and len(input_shape) > 1:

TypeError: array() takes 1 positional argument but 2 were given


Here是 Google Colab 链接

最佳答案

你可以用 tf.one_hot 来做.
如果采样函数的输入是二维的:

X = np.random.uniform(0,1, (100,1,1))
y = tf.keras.utils.to_categorical(np.random.randint(0,3, (100,)))

def sampling(x):
zeros = x*0 ### useless but important to produce gradient
samples = tf.random.categorical(tf.math.log(x), 1)
samples = tf.squeeze(tf.one_hot(samples, depth=3), axis=1)
return zeros+samples


inp = Input(shape=(1,1,))
x, _, _ = LSTM(100, return_sequences=False, return_state=True)(inp)
x = Dense(3, activation="softmax")(x)
out = Lambda(sampling)(x)

model = Model(inp, out)
model.compile('adam', 'categorical_crossentropy')
model.fit(X,y, epochs=3)
如果采样函数的输入是3D: tf.random.categorical只接受 2D logits。您可以使用 tf.map_fn 调整 3D logits 的操作
X = np.random.uniform(0,1, (100,1,1))
y = tf.keras.utils.to_categorical(np.random.randint(0,3, (100,)))
y = y.reshape(-1,1,3)

def sampling(x):
zeros = x*0 ### useless but important to produce gradient
samples = tf.map_fn(lambda t: tf.random.categorical(tf.math.log(t), 1), x, fn_output_signature=tf.int64)
samples = tf.squeeze(tf.one_hot(samples, depth=3), axis=1)
return zeros+samples


inp = Input(shape=(1,1,))
x, _, _ = LSTM(100, return_sequences=True, return_state=True)(inp)
x = Dense(3, activation="softmax")(x)
out = Lambda(sampling)(x)

model = Model(inp, out)
model.compile('adam', 'categorical_crossentropy')
model.fit(X,y, epochs=3)
here正在运行的笔记本

关于python - 在 Keras 中制作采样层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67122137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com