به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

+1 امتیاز

با سلام..
من mnist رو با تنسورفلو اجرا کردم با استفاده از همون شبکه ای که تو مثال تنسورفلو هست..
حالا میخوام با همون معماری ولی با دیتاست ارقام دستنویس فارسی اینکار رو انجام بدم نمیدونم چطوری میتونیم تصاویر رو بهش بشناسونیم که بتونه بخونه..
تو اون مثال اول تو مسیر خودش دانلود میکنه و به پوشه مورد نظر رو میسازه ولی برای این دیتاست نمیدونم چه دستوری تو پایتون مثلا مشابه دستور imread تو متلب هستش؟

توسط (155 امتیاز)

1 پاسخ

+4 امتیاز

سلام
شما کلا باید دوتا آرایه داشته باشید یکی داده و یکی هم لیبل ها . (برای تست هم به همین صورت هست )
کاری که میکنید تصاویر رو از ورودی میخونید بعد هر تصویر رو به یک بردار تبدیل میکنید . میتونید از reshape استفاده کنید میتونید از flatten هم استفاده کنید. اگه همه تصاویر رو بخونید در داخل یک آرایه بزرگ برای اینکه سربار زیادی ایجاد نشه میتونید از ravel() بجای flatten هم استفاده کنید.
مثلا کد زیر تصاویر یه پوشه رو میخونه تبدیل به بردار میکنه و بعد در یک آرایه دو بعدی به همین منظور ذخیره میکنه . اندازه تصاویر مثلا ۲۸ در ۲۸ هست (سایز ام نیست ) و تعداد ترینینگ ست شما هم مثلا ۱۰ .

import numpy as np
import matplotlib.pyplot as plt
try:
    from scipy import misc
except ImportError:
    !pip install scipy
    from scipy import misc

training_size = 10
img_size = 28*28
training_data = np.empty(shape=(training_size, img_size))  

import glob
i = 0
for filename in glob.glob('/home/hossein/Pictures/*.jpg'): 
    image = misc.imread(filename)
    #اینجا تصویر رو در قالب یه وکتور یه بعدی در میاریم و بعد ذخیره اش میکنیم
    training_data[i] = image.reshape(-1)
    i+=1
    

print(training_data[0].shape)

بعد شما لیبل ها رو میخونید اما باید بجای یه وکتور با سایز ۱۰ (که شماره هر کلاس در یک خونه ذخیره شده )‌یه آرایه دو بعدی به سایز [training_set_size, number_of_classes] و بعد ببینید شماره کدوم کلاسه و اندیس متناظر با اون ۱ و بقیه رو صفر کنید .
یه شیوه ساده برای خوندن لیبل ها میتونه اینطور باشه
مثلا فایل لیبل من فرمتش به این شکل هست :

img1.png 1
img2.png 2
img3.png 3
img4.png 4
img5.png 5

و اینطور میشه عمل کرد :

In [2]: labels = []
     ...: with open("C:/Users/Hossein/Documents/labels.txt") as f:
     ...:     for line in f:
     ...:         if len(line.strip()) !=0 :
     ...:             labels.append(line.strip().split(' ')[1])

اون if هم برای اینه که اگه چندتا خط خالی باشه مارو دچار خطا نکنه . خروجی هم بصورت لیست هست. اگه مستقیما میخواییم تو یه آرایه numpy نتایج رو داشته باشیم میشه اینطور عمل کرد (اون 5 تعداد ایتم های ماست. یعنی چندتا عکس داریم!):

In [3]: labels = np.empty(5,dtype=np.uint8)
     ...: i = 0
     ...: with open("C:/Users/Hossein/Documents/labels.txt") as f:
     ...:     for line in f:
     ...:         if len(line.strip()) !=0 :
     ...:             labels[i] = line.strip().split(' ')[1]
     ...:             i+=1
     ...:
     ...:

In [4]: labels
Out[4]: array([1, 2, 3, 4, 5], dtype=uint8)

میتونید این کار رو بصورت یکدفعه و یکجا انجام بدید به اینصورت که اول همه لیبلها رو در یک وکتور بخونید بعد با استفاده از دستور زیر ماتریس مورد نظرتون رو بدست بیارید :

import numpy as np
np.eye(Tedade_classha)[Vector_labelha]

مثلا اگر 10 کلاس دارید و تعداد ایتم ها هم 10 تاس یعنی 10 تا عکس داریم که لیبلهاشون به ترتیب بصورت زیر باشه دستور به شکل زیر در میاد

np.eye(10)[[2, 4, 1,0,3,5,9,8,7,6]]

که خروجیش میشه مثل شکل زیر :

Out[5]:
array([[ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.]])

اگه ورودی 3 تا بود مثلا میشه این مثلا

In [6]: np.eye(10)[[2, 4, 1]]
Out[6]:
array([[ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

یه روش خیلی ساده تر هم اخیرا فهمیدم که از این ساده تره و اونم استفاده از تابع get_dummies مربوط به pandas هست. همون مثال قبل رو میشه براحتی بصورت زیر هم حساب کرد:

In [7]: import pandas as pd
In [8]: pd.get_dummies(a)
Out[8]:
   0  1  2  3  4  5  6  7  8  9
0  0  0  1  0  0  0  0  0  0  0
1  0  0  0  0  1  0  0  0  0  0
2  0  1  0  0  0  0  0  0  0  0
3  1  0  0  0  0  0  0  0  0  0
4  0  0  0  1  0  0  0  0  0  0
5  0  0  0  0  0  1  0  0  0  0
6  0  0  0  0  0  0  0  0  0  1
7  0  0  0  0  0  0  0  0  1  0
8  0  0  0  0  0  0  0  1  0  0
9  0  0  0  0  0  0  1  0  0  0

دیگه کار خاصی ندارید و میتونید از بقیه کد ها استفاده کنید.
البته تنسورفلو از ورژن .07 انگار تابع one_hot رو قرار داده که میتونید از اون هم استفاده کنید و نیازی به این دستور بالا نداشته باشید . اینجا رو بخونید
برای تنسورفلو هم میتونید از تابع one_hot استفاده کنید که توضیح دادم . نحوه استفاده اش هم بصورت زیر هست :
tf.one_hot(a,10) که اولی یه آرایه حاوی لیبلهای شماست و دومین پارامتر یا همون پارامتر depth شما تعداد کلاسهای شما رو مشخص میکنه. مثل بالا رو در پایین زدم تا مشخص باشه :

In [9]: a = [2, 4, 1,0,3,5,9,8,7,6]
In [10]: b = tf.one_hot(a,10)
In [11]: sess = tf.Session()
In [12]: sess.run(b)
Out[12]:
array([[ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.]], dtype=float32)
توسط (4.3k امتیاز)
ویرایش شده توسط
سلام.. ممنون از پاسختون.
من میخواستم تصاویر ارقام فارسی که سایزهای مختلف دارند رو به سایز ام نیست در بیارم و از معماری اون استفاده کنم.. اینها کدهای است که با کمک شما نوشتم:
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import scipy.misc
import sys
try:
    from scipy import misc
except ImportError:
  
   from scipy import misc
training_size = 10
img_size = 28*28
training_data = np.empty(shape=(training_size, img_size))  
i_width = 28
i_height = 28
print (training_data)
import glob
i = 0
for filename in glob.glob('/home/ninja/tensorfile/Hoda/Trainset/*.bmp'):
    images = misc.imread(filename)
    image=scipy.misc.imresize(images, (i_height, i_width))
    #print (images)
    training_data[i] = image.reshape(-1)
    i+=1
    
print(training_data[0].shape)
اما نمیدونم چرا تو قسمت reshape خطا میده:
File "farsimnist.py", line 25, in <module>
    training_data[i] = image.reshape(-1)
IndexError: index 10 is out of bounds for axis 0 with size 10
بخش دوم توضیحتون هم خیلی متوجه نشدم!! خود کد  ام نیست که من دارم این خط رو داره که
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot = True)
اما من دیتابیسم متفاوته... نمیدونم باید چکار کرد؟؟
دلیل خطا بخاطر شمارنده شماس. تو مثال ما 10 نمونه مشخص کردیم شما باید اندازه دیتاست خودتون رو مشخص کنید.
بخش دوم هم یعنی در تنسورفلو mnist رو قبلا خودشون کدهای مورد نیازش رو نوشتن و با فراخونی اون متد براحتی داده ها رو بدست میارید. مثالی که من زدم برای مواقعی هست که دیتاستتون رو خودتون قراره بسازید.
سلام واحترام.در مطلب بالا برای تعریف لیبل ها ،اگر برای 10 ورودی که فرض کردیم به جای 10 کلاس 3 کلاس داشته باشیم به جای
np.eye(10)[[2, 4, 1,0,3,5,9,8,7,6]]
چطور لیبل ها رو تعریف می کنیم؟
سلام . توضیحات تکمیلی رو به جواب اضافه کردم .
سپاس فراوان ازتوجه جنابعالی؛
منظورمن این هست که فرض بفرمایید ما 10 ورودی با 3 کلاس داریم...ویا درحالت کلی 1000تصویر ورودی با 3 کلاس داریم (تعداد ورودی و تعداد لیبل ها متفاوت هستند)در اینصورت باید چطورلیبل ها رو تعریف کرد؟
با تجدید سپاس
سلام . خب مثال رو زدم. دقت نکردید؟ . ورودی شما هیچ ربطی به تعداد کلاس شما تو تابع one_hot تنسورفلو و همینطور روش eye که بالا مثال زدم نداره.(اما تو مثال pandas داره!)
 برای مثال eye  اگه دقت کرده باشید نوشتم np.eye(Tedade_classha)[Vector_labelha]
یعنی تعداد کلاس هرچی هست (مثلا 3 ) رو اینجا تو پرانتز مینویسید. و بعد آرایه ای از لیبل ها که حالا میتونه 10 تا ایتم داشته باشه میتونه 1000 تا داشته باشه رو بهش میدید.
برای تنسورفلو هم که مشخصه depth تعداد کلاس شماس و ورودی هم که مشخصه
بله .درست میفرمایید.سپاس فراوان.
سلام. ببهشید من میخواستم بدونم برای زمانی که عکس‌ها سه کاناله باشن (RGB)  سایز تصویرم رو باید چجوری تعریف کنم که وقتی از reshape استفاده میکنم درست باشه ؟
سلام. سایز تصویر شما مرتبط با مساله شماست. من دقیقا متوجه نمیشم منظور شما چیه؟
...