質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Python 3.x

    6367questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • TensorFlow

    673questions

AttributeError: 'Cifar10Reader' object has no attribute 'bytestream' のエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 899
退会済みユーザー

退会済みユーザー

AttributeError: 'Cifar10Reader' object has no attribute 'bytestream'  のエラー が出ました。
reader.py

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import numpy as np

class Cifar10Record(object):
    width = 32
    height = 32
    depth = 3

    def set_label(self,label_byte):
        #self.label = np.frombuffer(label_byte,dtype=np.unit8)
        self.label = np.frombuffer(label_byte,dtype=np.uint8) # unit8 -> uint8に修正

    def set_image(self,image_bytes):
        byte_buffer = np.frombuffer(image_bytes,dtype=np.int8)
        reshaped_array = np.reshape(byte_buffer,[self.depth,self.height,self.width])
        self.byte_array = np.transpose(reshaped_array,[1,2,0])
        self.byte_array = self.byte_array.astype(np.float32)

class Cifar10Reader(object):
 def __init__(self,filename):
     if not os.path.exists(filename):
         print(filename + ' is not exist')
         return

     self.bytestream = open(filename,mode="rb")

 def close(self):
     if not self.bytestream:
         self.bytestream.close()

 def read(self,index):
     result = Cifar10Record()

     label_bytes = 1
     image_bytes = result.height * result.width * result.depth
     record_bytes = label_bytes + image_bytes

     self.bytestream.seek(record_bytes * index,0)

     result.set_label(self.bytestream.read(label_bytes))
     result.set_image(self.bytestream.read(image_bytes))

     return result

     print(self.bytestream)

# 追加
reader = Cifar10Reader("lena_std.tif")
ret = reader.read(0)
print(ret)


というCIFAR-10形式のデータセットを読み込むプログラム を書きました。
参考url:
http://www.buildinsider.net/small/booktensorflow/0201

他に使用しているスクリプトは
png10.py

# coding: utf-8

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os

import numpy as np
import tensorflow as tf
from PIL import Image

from reader import Cifar10Reader

FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('file',None,"処理するファイルのパス")
tf.app.flags.DEFINE_integer('offset',0,"読み飛ばすレコード数")
tf.app.flags.DEFINE_integer('length',16,"読み込んで変換するレコード数")

basename = os.path.basename(FLAGS.file)
path = os.path.dirname(FLAGS.file)

reader = Cifar10Reader(FLAGS.file)

stop = FLAGS.offset + FLAGS.length

for index in range(FLAGS.offset,stop):
    image = reader.read(index)

    print('label: %d' % image.label)
    imageshow = Image.fromarray(image.byte_array.astype(np.unit8))

    file_name = '%s-%02d-%d.png' % (basename,index,image.label)
    file = os.path.join(path,file_name)
    with open(file,mode='wb') as out:
        imageshow.save(out,format='png')

reader.close()


model.py

# coding: utf-8

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf

NUM_CLASSES = 10

def _get_weights(shape,stddev=1.0):
  var = tf.get_variable(
      'weights',
      shape,
      initializer=tf.truncated_normal_initializer(stddev=stddev)
  )
  return var

def _get_biases(shape,value=0.0):
  var = tf.get_variable(
      'biases',
      shape,
      initializer=tf.constant_initializer(value)
  )
  return var

def inference(image_node):
   #  conv1
   with tf.variable_scope('conv1') as scope:
     weights = _get_weights(shape=[5,5,3,64],stddev=1e-4)
     conv = tf.nn.conv2d(image_node,weights,[1,1,1,1],padding='SAME')
     biases = _get_biases([64],value=0.1)
     bias = tf.nn.bias_add(conv,biases)
     conv1 = tf.nn.relu(bias,name=scope.name)

   #  pool
   pool1 = tf.nn.max_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME',name='pool1')

   #  conv2
   with tf.variable_scope('conv2') as scope:
     weights = _get_weights(shape=[5,5,64,64],stddev=1e-4)
     conv = tf.nn.conv2d(pool1,weights,[1,1,1,1],padding='SAME')
     biases = _get_biases([64],value=0.1)
     bias = tf.nn.bias_add(conv,biases)
     conv2 = tf.nn.relu(bias,name=scope.name)

   #  pool2
   pool2 = tf.nn.max_pool(conv2,ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME',name='pool2')
   reshape = tf.reshape(pool2,[1,-1])
   dim = reshape.get_shape()[1].value

   #  fc3
   with tf.variable_scope('fc3') as scope:
       weights = _get_weights(shape=[dim,384],stddev=0.04)
       biases = _get_biases([384],value=0.1)
       fc3 = tf.nn.relu(
           tf.matmul(reshape,weights) + biases,
           name=scope.name
       )

   #  fc4
   with tf.variable_scope('fc4') as scope:
       weights = _get_weights(shape=[384,192],stddev=0.04)
       biases = _get_biases([192],value=0.1)
       fc4 = tf.nn.relu(tf.matmul(fc3,weights) + biases,name=scope.name)

   #   output
   with tf.variable_scope('output') as scope:
       weights = _get_weights(shape=[192,NUM_CLASSES],stddev=1/192.0)
       biases = _get_biases([NUM_CLASSES],value=0.0)
       logits = tf.add(tf.matmul(fc4,weights),biases,name='logits')


   return logits


inference.py

# coding: utf-8

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import time
import tensorflow as tf

import model as model

from reader import Cifar10Reader

FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_integer('epoch',30,"訓練するEpoch数")
tf.app.flags.DEFINE_string('data_dir','./data/',"訓練データのディレクトリ")
tf.app.flags.DEFINE_string('checkpoint_dir','./checkpoints/',"チェックポイントを保存するディレクトリ")

filenames = [
    os.path.join(FLAGS.data_dir,'data_batch_%d.bin' % i) for i in range(1,6)
]


def main(argv=None):
    train_placeholder = tf.placeholder(tf.float32,shape=[32,32,3],name='input_image')
    image_node = tf.expand_dims(train_placeholder,0)

    logits = model.inference(image_node)

    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())

        total_duration = 0

        for epoch in range(1,FLAGS.epoch+1):
            start_time = time.time()

            for file_index in range(5):
                print('Epoch %d: %s' % (epoch,filenames[file_index]))
                reader = Cifar10Reader(filenames[file_index])

                for index in range(10000):
                    image = reader.read(index)

                    logits_value = sess.run([logits],feed_dict={
                        train_placeholder:image.byte_array,
                    })

                    if index % 1000 ==0:
                        print('[%d]: %r'% (image.label,logits_value))

            reader.close()

            duration = time.time() - start_time
            total_duration += duration

            print('epoch %d duration = %d sec'%(epoch,duration))

            tf.train.SummaryWriter(FLAGS.checkpoint_dir,sess.graph)
        print('Total duration = %d sec'% total_duration)

if __name__ == '__main__':
    tf.app.run()


しかし、inference.py を実行すると

File "inference.py", line 44, in main
    image = reader.read(index)
  File "/Users/XXX/Desktop/cifar/reader.py", line 43, in read
    self.bytestream.seek(record_bytes * index,0)
AttributeError: 'Cifar10Reader' object has no attribute 'bytestream'


というエラーが出てしまいました。
Cifar10Reader にbytestream を引数として持たせなければならない、という意味ですよね?でも参考urlの書き方ではCifar10Readerクラスの引数にbytestream を指定していません。
どう直せば良いのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

質問文に書かれたソースと実際のソースコードは同じでしょうか?
変数名などで誤字があると思われます。

ちなみに、こちらの環境では以下の通り unit8  を uint8 に修正し、lena.jpgを読み込んだ結果ではエラー発生なく実行できました。

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import numpy as np

class Cifar10Record(object):
    width = 32
    height = 32
    depth = 3

    def set_label(self,label_byte):
        #self.label = np.frombuffer(label_byte,dtype=np.unit8)
        self.label = np.frombuffer(label_byte,dtype=np.uint8) # unit8 -> uint8に修正

    def set_image(self,image_bytes):
        byte_buffer = np.frombuffer(image_bytes,dtype=np.int8)
        reshaped_array = np.reshape(byte_buffer,[self.depth,self.height,self.width])
        self.byte_array = np.transpose(reshaped_array,[1,2,0])
        self.byte_array = self.byte_array.astype(np.float32)

class Cifar10Reader(object):
 def __init__(self,filename):
     if not os.path.exists(filename):
         print(filename + ' is not exist')
         return

     self.bytestream = open(filename,mode="rb")

 def close(self):
     if not self.bytestream:
         self.bytestream.close()

 def read(self,index):
     result = Cifar10Record()

     label_bytes = 1
     image_bytes = result.height * result.width * result.depth
     record_bytes = label_bytes + image_bytes

     self.bytestream.seek(record_bytes * index,0)

     result.set_label(self.bytestream.read(label_bytes))
     result.set_image(self.bytestream.read(image_bytes))

     return result

# 追加
reader = Cifar10Reader("lena.jpg")
ret = reader.read(0)
print(ret)

結果

<__main__.Cifar10Record object at 0x000001DAB5038CC0>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/09 15:53

    ありがとうございます。確かに上記のスクリプト(reader.py)を実行すると、正常に実行されます。しかし、最終的に実行したいスクリプトであるinference.pyを実行すると、同じエラーが出てしまいます。参考までに、使っているコード全部を載せるのでもし原因がわかりましたら教えてください、お願いいたします。

    キャンセル

  • 2017/04/10 11:25

    どのように各ファイルを配置されているか不明ですが、異なるファイル(reader.py)をimportしているなどの可能性はないでしょうか?
    私ならreader.pyに以下のようなprint文を加えて確認してみますが。
    print(self.bytestream) # bytestreamが「_io.BufferedReader」か確認
    self.bytestream.seek(record_bytes * index,0)

    キャンセル

  • 2017/04/11 20:41

    print(self.bytestream) を実行したのですが、呼ばれませんでした。
    これはどういうことなのでしょうか?(reader.pyではないファイルを読み込んでいるということでしょうか?)出力結果は <reader.Cifar10Record object at 0x10d936a58>のようになり、書いたコードは上記のreader.pyのようにしました。

    キャンセル

  • 2017/04/11 20:51

    > print(self.bytestream) を実行したのですが、呼ばれませんでした。
    > reader.pyではないファイルを読み込んでいるということでしょうか?
    呼ばれるはずが呼ばれてないので、そう判断せざるをえません。

    キャンセル

  • 2017/04/11 21:49

    なるほど!ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    GO言語のhttpリクエスト

    GO言語を使用したhttpリクエストを行いたいのです jsonをPOSTしたいのですがどのように書けばいいのでしょうか

  • 解決済

    Tensorflowのfully_connected_feedの実行にエラーが続く

    tensoflowのfully_connected_feed.pyを実行しようとしているのですが、どう試行錯誤してもエラーが続きます。 tensorflowのインストールの仕方、

  • 解決済

    wxPythonにおいて、USBカメラの画像表示をしたい

    前提・実現したいこと ここ一週間くらい、teratailの皆様の力を借りながら、python上で動く動画や画像を表示できるGUIを作っています。画像は何とか表示でき、画像とパネル

  • 受付中

    DBに画像を登録したい

    お世話になります。 情報管理画面を作成しているのですが、画像登録ではまってしまっています。 128行目のパラメータの部分で CS0029    型 'System.Draw

  • 解決済

    tensorflowでのalexnetの実装で精度が変化しない

    前提・実現したいこと こんにちは。 趣味で画像認識を勉強しているものです。 「tensorflowでゆるゆりの製作会社を判定してみた」(http://mobiles-han.blo

  • 解決済

    【python3】pyqt5で画像を任意の位置に表示したい

    前提・実現したいこと python3.5を使っています。pyqt5で作ったウィジットの任意の位置に画像を表示したいです 発生している問題・エラーメッセージ 画像の表示位置を指定

  • 解決済

    Pythonスクレイピング

     前提・実現したいこと Yahoo画像検索を使用して画像を集めまくるプログラムを作成したいのです。※超初心者です。  発生している問題 bs4で画像のURLを取得する方法が解ら

  • 解決済

    Kerasでファインチューニング

     前提・実現したいこと 画像分類モデルを作成しています。 その際、Kerasでファインチューニングに挑戦しています。 InceptionやInceptionResNetV2のファイ

同じタグがついた質問を見る

  • Python 3.x

    6367questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • TensorFlow

    673questions