首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InvalidArgumentError in softmax_cross_entropy_with_logits

InvalidArgumentError in softmax_cross_entropy_with_logits
EN

Stack Overflow用户
提问于 2018-04-19 21:44:30
回答 1查看 524关注 0票数 1

我对tensorflow非常陌生,并试图对Iris数据集做一些实验。我创建了以下模型函数(MWE):

代码语言:javascript
复制
def model_fn(features, labels, mode):
    net = tf.feature_column.input_layer(features, [tf.feature_column.numeric_column(key=key) for key in FEATURE_NAMES])

    logits = tf.layers.dense(inputs=net, units=3)

    loss = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)

    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
    train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())

    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

不幸的是,我得到了以下错误:

代码语言:javascript
复制
InvalidArgumentError: Input to reshape is a tensor with 256 values, but the requested shape has 1
 [[Node: Reshape = Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"](softmax_cross_entropy_with_logits_sg, Reshape/shape)]]

似乎是张量形状的问题。然而,逻辑和标签的形状都是相同的(256,3) --这是文档所要求的。同时,这两个张量都有float32类型。

为了完整起见,下面是估计器的输入函数:

代码语言:javascript
复制
import pandas as pd
import tensorflow as tf
import numpy as np

IRIS_DATA = "data/iris.csv"

FEATURE_NAMES = ["sepal_length", "sepal_width", "petal_length", "petal_width"]
CLASS_NAME = ["class"]

COLUMNS = FEATURE_NAMES + CLASS_NAME

# read dataset
iris = pd.read_csv(IRIS_DATA, header=None, names=COLUMNS)

# encode classes
iris["class"] = iris["class"].astype('category').cat.codes

# train test split
np.random.seed(1)
msk = np.random.rand(len(iris)) < 0.8
train = iris[msk]
test = iris[~msk]

def iris_input_fn(batch_size=256, mode="TRAIN"):
    def prepare_input(data=None):

        #do mean normaization across all samples
        mu = np.mean(data)
        sigma = np.std(data)

        data = data - mu
        data = data / sigma
        is_nan = np.isnan(data)
        is_inf = np.isinf(data)
        if np.any(is_nan) or np.any(is_inf):
            print('data is not well-formed : is_nan {n}, is_inf: {i}'.format(n= np.any(is_nan), i=np.any(is_inf)))


        data = transform_data(data)
        return data

    def transform_data(data):
        data = data.astype(np.float32)
        return data


    def load_data():
        global train

        trn_all_data=train.iloc[:,:-1]
        trn_all_labels=train.iloc[:,-1]


        return (trn_all_data.astype(np.float32),
                                              trn_all_labels.astype(np.int32))

    data, labels = load_data()
    data = prepare_input(data)

    labels = tf.one_hot(labels, depth=3)

    labels = tf.cast(labels, tf.float32)
    dataset = tf.data.Dataset.from_tensor_slices((data.to_dict(orient="list"), labels))

    dataset = dataset.shuffle(1000).repeat().batch(batch_size)

    return dataset.make_one_shot_iterator().get_next()

来自UCI回购的数据集

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-22 13:10:54

通过替换nn模块中的损失函数来解决这个问题:

代码语言:javascript
复制
loss = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)

损失模块的损失函数

代码语言:javascript
复制
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)

或通过

代码语言:javascript
复制
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits))

输入到GradientDescentOptimizer最小方法的损失必须是标量。整个批次的单个值。

问题是,我计算了该批中每一个元素的softmax交叉熵,从而得到包含256 (批大小)交叉熵值的张量,并试图用最小方法提供这个值。因此,错误消息

代码语言:javascript
复制
Input to reshape is a tensor with 256 values, but the requested shape has 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49930682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档