如何制作 2D softmax 层?
how can I make a 2D softmax Layer?
我正在使用 keras 库制作网络。
假设我有二维矩阵
[0 0 1 2
0 1 2 5
1 0 0 1 ]
我想做的是得到下面的矩阵
[ 0.00 0.00 0.02 0.10
0.00 0.02 0.10 0.99
0.02 0.00 0.00 0.02 ]
如图所示,我想让图层表达二维数组的最大元素,只强调。
我怎样才能做到这一点?
这是否可以通过简单地调整两次softmax来实现?
您无需担心 2d 形状,softmax 可以正常工作。
import tensorflow as tf
inputs = tf.random.normal(shape=(3, 3))
outputs = tf.keras.activations.softmax(inputs)
print(inputs)
print(outputs)
tf.Tensor(
[[-0.3471133 -0.8292573 -0.06646241]
[-1.2869339 -0.52089226 0.3157407 ]
[-0.8821394 0.16500719 -0.41590676]], shape=(3, 3), dtype=float32)
tf.Tensor(
[[0.33996844 0.2099163 0.4501153 ]
[0.12319015 0.26501083 0.61179894]
[0.18370579 0.52347124 0.29282293]], shape=(3, 3), dtype=float32)
如果我没理解错的话,你想对整个二维数组进行softmax。如果是这样,直接将 softmax 应用于 2D 数组将 return 每列上的 softmax(单独!)。例如:
X = np.log([[1, 1, 2], [3, 3, 3]])
Y = tf.keras.layers.Activation('softmax')(X)
assert np.allclose(Y, [[0.25, 0.25, 0.5], [0.3333, 0.3333, 0.3333]], atol=1e-4)
如果你想对 2D 向量的所有元素进行 softmax,应该这样做:
X = np.log([[1, 1, 1], [1, 2, 4]])
X = np.expand_dims(X, axis=0) # add batch dim
X = tf.keras.layers.Reshape((-1,))(X) # the batch dimension will be preserved (shape in Reshape doesn't include the batch dim)
# equivalent to: X = X.reshape(m, -1), where m is the batch dim.
# This however will not keep track of the gradients for backprop.
#That's why, it's better to use a Reshape layer.
Y = tf.keras.layers.Activation('softmax')(X)
assert np.allclose(Y, [[0.1, 0.1, 0.1, 0.1, 0.2, 0.4]])
我正在使用 keras 库制作网络。
假设我有二维矩阵
[0 0 1 2
0 1 2 5
1 0 0 1 ]
我想做的是得到下面的矩阵
[ 0.00 0.00 0.02 0.10
0.00 0.02 0.10 0.99
0.02 0.00 0.00 0.02 ]
如图所示,我想让图层表达二维数组的最大元素,只强调。
我怎样才能做到这一点?
这是否可以通过简单地调整两次softmax来实现?
您无需担心 2d 形状,softmax 可以正常工作。
import tensorflow as tf
inputs = tf.random.normal(shape=(3, 3))
outputs = tf.keras.activations.softmax(inputs)
print(inputs)
print(outputs)
tf.Tensor(
[[-0.3471133 -0.8292573 -0.06646241]
[-1.2869339 -0.52089226 0.3157407 ]
[-0.8821394 0.16500719 -0.41590676]], shape=(3, 3), dtype=float32)
tf.Tensor(
[[0.33996844 0.2099163 0.4501153 ]
[0.12319015 0.26501083 0.61179894]
[0.18370579 0.52347124 0.29282293]], shape=(3, 3), dtype=float32)
如果我没理解错的话,你想对整个二维数组进行softmax。如果是这样,直接将 softmax 应用于 2D 数组将 return 每列上的 softmax(单独!)。例如:
X = np.log([[1, 1, 2], [3, 3, 3]])
Y = tf.keras.layers.Activation('softmax')(X)
assert np.allclose(Y, [[0.25, 0.25, 0.5], [0.3333, 0.3333, 0.3333]], atol=1e-4)
如果你想对 2D 向量的所有元素进行 softmax,应该这样做:
X = np.log([[1, 1, 1], [1, 2, 4]])
X = np.expand_dims(X, axis=0) # add batch dim
X = tf.keras.layers.Reshape((-1,))(X) # the batch dimension will be preserved (shape in Reshape doesn't include the batch dim)
# equivalent to: X = X.reshape(m, -1), where m is the batch dim.
# This however will not keep track of the gradients for backprop.
#That's why, it's better to use a Reshape layer.
Y = tf.keras.layers.Activation('softmax')(X)
assert np.allclose(Y, [[0.1, 0.1, 0.1, 0.1, 0.2, 0.4]])