Несоответствие типов данных при вычислении энтропии с помощью softmax

#python #tensorflow #softmax

#python #тензорный поток #softmax

Вопрос:

Я использую приведенный ниже код для вычисления энтропии для прогнозируемых меток и фактических меток. Данные получены из набора данных CIFAR-10.

Я использовал astype (np.float32) для преобразования исходных данных в ndarrays, а затем использовал dtype как float32 в tf.constant(). Сообщение об ошибке

Ошибка типа: тип данных float32 для attr ‘Tlabels’ отсутствует в списке допустимых значений: int32, int64

перечисляет, что только int32, int64 разрешены типы данных. Без явного указания типов данных в вышеуказанных 2 шагах я сталкиваюсь с препятствием при операции matmul (), поскольку термин weights, используемый в вычислении, относится к типу данных float.

 f = open('cifar-10-batches-py/data_batch_1', 'rb')
datadict = cPickle.load(f,encoding='bytes')
#f.close()
X = np.asarray(datadict[b"data"]).astype(np.float32)  #b prefix is for bytes string literal.
Y = np.asarray(datadict[b'labels']).astype(np.float32)
f = open('cifar-10-batches-py/data_batch_1', 'rb')
datadict = cPickle.load(f,encoding='bytes')
#f.close()
X = np.asarray(datadict[b"data"]).astype(np.float32)  #b prefix is for bytes string literal.
Y = np.asarray(datadict[b'labels']).astype(np.float32)
graph = tf.Graph()
with graph.as_default():
    tf_train_data = tf.constant(X, dtype = tf.float32)
    tf_train_labels = tf.constant(Y, dtype = tf.float32)
    tf_test_data = tf.constant(X_test, dtype = tf.float32)
    tf_test_labels = tf.constant(Y_test, dtype = tf.float32)
    print (tf_train_labels.get_shape())
    weights = tf.Variable(tf.truncated_normal([3072, 10]))
    print (tf.rank(weights))
    biases = tf.Variable(tf.zeros([10]))
    logits = tf.matmul(tf_train_data, weights)   biases
    print (tf.rank(logits), tf.rank(tf_train_labels), tf.rank(tf_test_labels))
    loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits, tf_train_labels))
    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
    train_prediction = tf.nn.softmax(logits)
    test_prediction = tf.nn.softmax(tf.matmul(tf_test_data, weights)   biases)
  

Это сообщение об ошибке

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-74-8e1ffbeb5013> in <module>()
     11     logits = tf.matmul(tf_train_data, weights)   biases
     12     print (tf.rank(logits), tf.rank(tf_train_labels), tf.rank(tf_test_labels))
---> 13     loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits, tf_train_labels))
     14     optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
     15     train_prediction = tf.nn.softmax(logits)

/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/ops/nn_ops.py in sparse_softmax_cross_entropy_with_logits(logits, labels, name)
    562     if logits.get_shape().ndims == 2:
    563       cost, _ = gen_nn_ops._sparse_softmax_cross_entropy_with_logits(
--> 564           precise_logits, labels, name=name)
    565       if logits.dtype == dtypes.float16:
    566         return math_ops.cast(cost, dtypes.float16)

/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/ops/gen_nn_ops.py in _sparse_softmax_cross_entropy_with_logits(features, labels, name)
   1538   """
   1539   result = _op_def_lib.apply_op("SparseSoftmaxCrossEntropyWithLogits",
-> 1540                                 features=features, labels=labels, name=name)
   1541   return _SparseSoftmaxCrossEntropyWithLogitsOutput._make(result)
   1542 

/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py in apply_op(self, op_type_name, name, **keywords)
    527             for base_type in base_types:
    528               _SatisfiesTypeConstraint(base_type,
--> 529                                        _Attr(op_def, input_arg.type_attr))
    530             attrs[input_arg.type_attr] = attr_value
    531             inferred_from[input_arg.type_attr] = input_name

/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py in _SatisfiesTypeConstraint(dtype, attr_def)
     58           "DataType %s for attr '%s' not in list of allowed values: %s" %
     59           (dtypes.as_dtype(dtype).name, attr_def.name,
---> 60            ", ".join(dtypes.as_dtype(x).name for x in allowed_list)))
     61 
     62 

TypeError: DataType float32 for attr 'Tlabels' not in list of allowed values: int32, int64
  

Как я могу это исправить

Комментарии:

1. попробуйте использовать только astype (‘float’). это может помочь.

2. Есть ли у tensorflow тип данных с плавающей точкой. Из документации я мог видеть, что она начинается только с float32. Я попробовал это с помощью ndarrays, но это не помогло, tensorflow.org/versions/r0.11/resources/dims_types.html

Ответ №1:

tf.nn.sparse_softmax_cross_entropy_with_logits принимает разреженные метки целочисленного типа. Чтобы использовать одноразовые метки с плавающей точкой, рассмотрите возможность использования tf.nn.softmax_cross_entropy_with_logits вместо этого.

Комментарии:

1. Я использую разреженные метки, метки из входных данных представляют собой список с соответствующими классами для каждой входной записи. Нужно ли мне вместо этого преобразовать метку в метку с плавающей запятой..

2. Просто используйте для них целочисленный тип данных. Метки для разреженной кросс-энтропии должны иметь тип tf.int32 или tf.int64.

3. Я сделал это, но это не сработало бы, потому что тензор весов инициализируется с помощью truncated_normal(), который возвращает 2D-тензор с плавающей точкой. одна из операций matmul использует входные данные, X_train и веса. Для операции matmul мне нужно, чтобы X было равно float. Я изменил метки на int32, но это не помогло

4. Я исправил это, преобразовав разреженные метки в метки с одноразовым кодированием.