【问题标题】:TensorFlow Keras Softmax layer output has one more dimension respect to the inputTensorFlow Keras Softmax 层输出相对于输入多维
【发布时间】:2020-04-24 09:16:51
【问题描述】:

我有一个以 Softmax 层结尾的 keras 模型。 根据定义,Softmax 的输出形状与输入相同,但在我的情况下,它有一个额外的维度:[1, None, 20] 而不是 [None, 20]

谁能给我解释一下为什么?现在我用挤压修复了,但它仍然很奇怪

谢谢!

 def create_keras_model_embedding():
  l = tf.keras.layers
  a = l.Input(shape=(784,))
  embedded_lookup_feature = tf.feature_column.numeric_column('x', shape=(784))
  dense_features = l.DenseFeatures(embedded_lookup_feature)({'x': a})#{'x': a}
  dense = l.Dense(784)(dense_features)
  dense_2 = l.Dense(10, kernel_initializer='zeros')(dense),
  output = l.Softmax(axis=1)(dense_2)
  output = tf.squeeze(output)
  return tf.keras.Model(inputs=a, outputs=output)

model.summary() 的输出

【问题讨论】:

  • 你能在softmax层之前展平吗?这可能有效

标签: python tensorflow keras tensorflow2.0 softmax


【解决方案1】:

只需使用Activation,这是更标准和更常见的做法。

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
import tensorflow as tf
def create_keras_model_embedding():
  l = tf.keras.layers
  a = l.Input(shape=(784,))
  embedded_lookup_feature = tf.feature_column.numeric_column('x', shape=(784))
  dense_features = l.DenseFeatures(embedded_lookup_feature)({'x': a})#{'x': a}
  dense = l.Dense(784)(dense_features)
  dense_2 = l.Dense(10, kernel_initializer='zeros')(dense)
  output = l.Activation('softmax')(dense_2)
  return tf.keras.Model(inputs=a, outputs=output)

model = create_keras_model_embedding()
model.summary()
Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 784)]             0         
_________________________________________________________________
dense_features_2 (DenseFeatu (None, 784)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 784)               615440    
_________________________________________________________________
dense_5 (Dense)              (None, 10)                7850      
_________________________________________________________________
activation_1 (Activation)    (None, 10)                0         
=================================================================
Total params: 623,290
Trainable params: 623,290
Non-trainable params: 0
_________________________

如果要使用softmax,请使用axis=-1

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
import tensorflow as tf
def create_keras_model_embedding():
  l = tf.keras.layers
  a = l.Input(shape=(784,))
  embedded_lookup_feature = tf.feature_column.numeric_column('x', shape=(784))
  dense_features = l.DenseFeatures(embedded_lookup_feature)({'x': a})#{'x': a}
  dense = l.Dense(784)(dense_features)
  dense_2 = l.Dense(10, kernel_initializer='zeros')(dense)
  output = l.Softmax(axis=-1)(dense_2)
  return tf.keras.Model(inputs=a, outputs=output)

model = create_keras_model_embedding()
model.summary()
Model: "model_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 784)]             0         
_________________________________________________________________
dense_features_3 (DenseFeatu (None, 784)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 784)               615440    
_________________________________________________________________
dense_7 (Dense)              (None, 10)                7850      
_________________________________________________________________
softmax_1 (Softmax)          (None, 10)                0         
=================================================================
Total params: 623,290
Trainable params: 623,290
Non-trainable params: 0

【讨论】:

  • 谢谢,我用的是Softmax,因为官方教程里是这样用的
  • 你可以使用softmax但是你的axis是错误的,试试axis=-1,这样softmax就不会应用到None而是最后10个密集单元。
  • 谢谢!查看您的代码,我发现实际上问题是softmax之前行末尾的逗号!该逗号创建了一个元组而不是一个新层
  • 我想说——在这种情况下,axis=1 和axis=-1 指的是同一个轴,所以它不应该有区别。此外,softmax 应该返回与输入具有相同形状的输出,无论轴如何,因此添加维度是非常出乎意料的。
  • 其实在某些情况下,你有超过2个维度(假设我要计算具有时间维度的LSTM输出的softmax),需要选择右轴,默认为-1所以你不必指定,但如果你使用像axis = 1这样的东西,你必须确保它是正确的。
猜你喜欢
  • 2021-09-06
  • 2017-03-31
  • 1970-01-01
  • 2018-02-22
  • 2019-07-31
  • 1970-01-01
  • 2019-02-25
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多