簡體   English   中英

Tensorflow-ValueError:排名不匹配:

[英]Tensorflow - ValueError: Rank mismatch:

我一直在嘗試訓練模型。 我寫了一個腳本來構造圖像數據集中的TFrecords。

這是訓練腳本的代碼:

import numpy as np
import tensorflow as tf
import cv2
from PIL import Image
import glob
import sys

batch_size=32
img_size=50
classes_names=[]
dataset_file=glob.glob("dataset/asl_alphabet_train/*")
sess = tf.Session()
sess.run(tf.global_variables_initializer())

for f in dataset_file:
    classes_names.append(f[27:]) # the name of the subfolders is the name of the class
num_classes=len(classes_names)

def parser(record):
    # a parsing function to parse the tfrecords
    keys_to_features={
        "img_raw": tf.FixedLenFeature([], tf.string),
        "label": tf.FixedLenFeature([], tf.int64)


    }
    parsed=tf.parse_single_example(record, keys_to_features)#parsing one example from the example buffer from the tfrecord using the keys 
    image= tf.decode_raw(parsed["img_raw"], tf.uint8)# decoding ( bytes -> tf.float32)
    image= tf.cast(image, tf.float32)
    #image= tf.reshape(image, shape=[50,50,3])#reshaping images
    label=tf.cast(parsed["label"], tf.int32)# casting labels to int32
    return  image, label

def input_fn(filenames, train_bool=True):
    #from tfrecord to iterable data 
    dataset=tf.data.TFRecordDataset(filenames=filenames, num_parallel_reads=40)# instantiantion of an object from class TFRecordDataset
    dataset= dataset.map(parser) # maps a function to the dataset
    if train_bool: 
        dataset= dataset.shuffle(buffer_size=2048)
        repeat=None # if in training mode allow reading data infinitely
    else :
        repeat=1 # if in validation or test allow max 1 read
    dataset= dataset.repeat(repeat)
    dataset= dataset.batch(batch_size)# define bach size
    iterator= dataset.make_one_shot_iterator()# making the iterator
    images_batch, labels_batch=iterator.get_next()# getting the data
    x= {'image': images_batch}
    y= labels_batch
    return x, y

def train_input_fn():
    return input_fn(filenames=["TFrecords/train.tfrecords"])

def val_input_fn():
    return input_fn(filenames=["TFrecords/val.tfrecords"],train_bool=False)

def test_input_fn():
    return input_fn(filenames=["TFrecords/test.tfrecords"])

def model_fn(features, labels, mode, params):

    Input=features['image']# transform the features to a tensor 
    Input=tf.reshape(Input, [-1,img_size,img_size,3])# reshaping to tensorflow networks compatible shapes

    output=tf.layers.conv2d(inputs=Input, name='conv1',
                filters=32, kernel_size=3,
                padding='same', activation=tf.nn.relu)
    output=tf.layers.max_pooling2d(inputs=output, pool_size=2, strides=2)

    output=tf.layers.conv2d(inputs=output, name='conv2',
                filters=64, kernel_size=3,
                padding='same', activation=tf.nn.relu)
    output=tf.layers.max_pooling2d(inputs=output, pool_size=2, strides=2)

    output=tf.layers.conv2d(inputs=output, name='conv3',
                filters=64, kernel_size=3,
                padding='same', activation=tf.nn.relu)
    output=tf.layers.max_pooling2d(inputs=output, pool_size=2, strides=2)

    output=tf.layers.flatten(output)


    output=tf.layers.dense(inputs=output, name='fc1',
                units=128, activation=tf.nn.relu)
    output=tf.layers.dropout(inputs=output, rate=0.5, noise_shape=None,
                 seed=None, training=(mode==tf.estimator.ModeKeys.TRAIN))
    output=tf.layers.dense(inputs=Input, name='fc2',units=num_classes)

    logits=output


    y_pred=tf.identity(tf.nn.softmax(logits=logits), name="logits")


    y_pred_cls=tf.identity(tf.argmax(y_pred,axis=1), name="classes")

    if mode == tf.estimator.ModeKeys.PREDICT:
        spec = tf.estimator.EstimatorSpec(mode=mode,predictions=y_pred_cls)

    else: 
        cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,labels=labels)

        loss=tf.reduce_mean(cross_entropy)

        optimizer= tf.train.AdamOptimizer(learning_rate=params["learning_rate"])
        train_op= optimizer.minimize(loss=loss, global_step=tf.train.get_global_step())
        metrics={ "accuracy":tf.metrics.accuracy(labels, y_pred_cls) }
        spec=tf.estimator.EstimatorSpec(
            mode=mode,
            loss=loss,
            train_op=train_op,
            eval_metric_ops=metrics)
    return spec

model = tf.estimator.Estimator(model_fn=model_fn,
                   params={"learning_rate":1e-2},
                   model_dir="Model/")

count=0
while(count<100000):
    model.train(input_fn=train_input_fn,steps=1000)
    result=model.evaluate(input_fn=val_input_fn)
    print(count)
    print("Classification accuracy: {0:.2%}".format(result["accuracy"]))
    sys.stdout.flush()
    count=count+1   

當我運行腳本時,出現以下錯誤:ValueError:等級不匹配:標簽的等級(收到1)應等於logits等級減去1(收到4)。

另外,我嘗試使用迭代器獲取每批圖像,並測試該批處理的大小,並測試是否收到正確的批處理大小,我是否獲得了正確的批處理大小。 但是,在模型的第一行中,當我嘗試將張量整形為[batch_size,img_size,imge,size,3]時,我收到一個錯誤,即所接收的張量的數量是預期批處理數:0的4倍。

錯誤跟蹤如下:

Traceback (most recent call last):
  File "Train.py", line 122, in <module>
    model.train(input_fn=train_input_fn,steps=1000)
  File "/home/hch/miniconda3/envs/DL_CUDA/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", line 366, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/home/hch/miniconda3/envs/DL_CUDA/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", line 1119, in _train_model
    return self._train_model_default(input_fn, hooks, saving_listeners)
  File "/home/hch/miniconda3/envs/DL_CUDA/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", line 1132, in _train_model_default
    features, labels, model_fn_lib.ModeKeys.TRAIN, self.config)
  File "/home/hch/miniconda3/envs/DL_CUDA/lib/python3.5/site-packages/tensorflow/python/estimator/estimator.py", line 1107, in _call_model_fn
    model_fn_results = self._model_fn(features=features, **kwargs)
  File "Train.py", line 101, in model_fn
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels,logits=logits)
  File "/home/hch/miniconda3/envs/DL_CUDA/lib/python3.5/site-packages/tensorflow/python/ops/nn_ops.py", line 2052, in sparse_softmax_cross_entropy_with_logits
    (labels_static_shape.ndims, logits.get_shape().ndims))
ValueError: Rank mismatch: Rank of labels (received 1) should equal rank of logits minus 1 (received 4).

你怎么看? 謝謝

我想到了 ! 這是一個愚蠢的錯誤。 在最后一個輸出層,當我應該使用“輸出”時,我輸入“輸入”:output = tf.layers.dense(inputs = Input,name ='fc2',units = num_classes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM