надеюсь, это поможет.

я тот же вопрос: вход для изменения формы это тензор с 37632 значениями, но запрошенная форма имеет 150528.

 writer = tf.python_io.TFRecordWriter("/home/henson/Desktop/vgg/test.tfrecords")  # 要生成的文件

for index, name in enumerate(classes):
    class_path = cwd + name +'/'
    for img_name in os.listdir(class_path):
        img_path = class_path + img_name  # 每一个图片的地址
    img = Image.open(img_path)
    img = img.resize((224, 224))
    img_raw = img.tobytes()  # 将图片转化为二进制格式
    example = tf.train.Example(features=tf.train.Features(feature={
        "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
        'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))
    }))  # example对象对label和image数据进行封装
    writer.write(example.SerializeToString())  # 序列化为字符串

writer.close()


def read_and_decode(filename):  # 读入dog_train.tfrecords
    filename_queue = tf.train.string_input_producer([filename])  # 生成一个queue队列

reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)  # 返回文件名和文件
features = tf.parse_single_example(serialized_example,
                                   features={
                                       'label': tf.FixedLenFeature([], tf.int64),
                                       'img_raw': tf.FixedLenFeature([], tf.string),
                                   })  # 将image数据和label取出来

img = tf.decode_raw(features['img_raw'], tf.uint8)
img = tf.reshape(img, [224, 224, 3])  # reshape为128*128的3通道图片
img = tf.cast(img, tf.float32) * (1. / 255) - 0.5  # 在流中抛出img张量
label = tf.cast(features['label'], tf.int32)  # 在流中抛出label张量
print(img,label)
return img, label

images, labels = read_and_decode("/home/henson/Desktop/vgg/TFrecord.tfrecords")
print(images,labels)
images, labels = tf.train.shuffle_batch([images, labels], batch_size=20, capacity=16*20, min_after_dequeue=8*20)

Мне нужно изменить размер img до 224 * 224 и изменить его на [224,224,3], но это не работает. Как я мог это сделать?

Ответы на вопрос(2)

я определил архитектуру, показанную на рисункеInt кодирования мы определили веса и смещения следующим образомЕсли мы видим (вес) Давайте начнем с

wc1 В этом слое я определил 32 фильтра размером 3х3.

wc2 В этом слое я определил 64 фильтра размером 3х3.

wc3 В этом слое я определил 128 фильтров размером 3х3.

wd1 38 * 38 * 128 интересно (откуда это берутся).

И в архитектуре мы также определили концепцию maxpooling. См. Рисунок архитектуры на каждом шаге. 1. Объясним это. Допустим, ваше входное изображение имеет размер 300 x 300 x 1 (на рисунке это 28x28x1). 2. (Если для определенных шагов установлено значение 1) Каждый фильтр будет иметь изображение 300x300x1, поэтому после применения 32 фильтра 3х3 у нас будет 32 картинки 300х300, таким образом собранные картинки будут 300х300х32

3. После Maxpooling, если (Strides = 2 зависит от того, что вы определили, обычно это 2), размер изображения изменится с 300 x 300 x 32 до150 х 150 х 32

(Если для определенных шагов установлено значение 1) Теперь каждый фильтр будет иметь изображение 150x150x32, поэтому после применения 64 фильтров 3x3 у нас будет 64 изображения 300x300, таким образом, собранные изображения будут 150x150x (32x64).

5. После Maxpooling, если (Strides = 2 зависит от того, что вы определили, обычно это 2), размер изображения изменится с 150x150x (32x64) на75 х 75 х (32 х 64)

(Если для определенных шагов установлено значение 1) Теперь каждый фильтр будет иметь изображение размером 75 x 75 x (32x64), поэтому после применения фильтра 3x3 размером 64 мы получим 128 изображений размером 75 x 75 x (32x64), таким образом, собранные изображения будут иметь размер 75 х 75 х (32х64х128)

7. После Maxpoolingпоскольку размер изображения составляет 75x75 (нечетное измерение делает его четным), поэтому необходимо сначала дополнить его (если определено заполнение = 'Same'), тогда оно изменится на 76x76 (четное) **, если (Strides = 2 зависит от того, что вы определили обычно) это 2) размер изображения изменится с 76x76x (32x64x128) до ** 38 x 38 x (32x64x128)

Теперь смотрите 'wd1' в кодировке картинки, здесь идет 38 * 38 * 128

image = tf.decode_raw(image_raw, tf.float32)
image = tf.reshape(image, [img_width, img_height, 3])

к этому:

image = tf.decode_raw(image_raw, tf.uint8)
image = tf.reshape(image, [img_width, img_height, 3])


# The type is now uint8 but we need it to be float.
image = tf.cast(image, tf.float32)

Это потому, что в моем формате данных generate_tf_record есть несоответствие. Я сериализовал его в строку вместо байлистов. Я замечаю разницу между тобой и мной, ты меняешь свой образ на байт. Вот как я пишу свое изображение в tfrecord.

            file_path, label = sample
            image = Image.open(file_path)
            image = image.resize((224, 224))
            image_raw = np.array(image).tostring()

            features = {
                'label': _int64_feature(class_map[label]),
                'text_label': _bytes_feature(bytes(label, encoding = 'utf-8')),
                'image': _bytes_feature(image_raw)
            }

            example = tf.train.Example(features=tf.train.Features(feature=features))
            writer.write(example.SerializeToString())  

надеюсь, это поможет.

Ваш ответ на вопрос