10

Python で Theano ライブラリを使用して、Deep Belief Networks でいくつかの実験をしようとしています。このアドレスのコードを使用します: DBN full code . このコードは、MNIST 手書きデータベースを使用します。このファイルは既に pickle 形式になっています。次の場所でアンピックされます:

  • 列車セット
  • 有効な_セット
  • テストセット

これはさらに解凍されます:

  • train_set_x、train_set_y = train_set
  • valid_set_x, valid_set_y = valid_set
  • test_set_x、test_set_y = test_set

自分のデータセットを作成するために、このデータセットを構築するコードを教えてください。私が使用する DBN の例では、この形式のデータが必要ですが、その方法がわかりません。誰かがこれを修正する方法を知っている場合は、教えてください。

これが私のコードです:

from datetime import datetime
import time
import os
from pprint import pprint
import numpy as np
import gzip, cPickle
import theano.tensor as T
from theano import function


os.system("cls")

filename = "completeData.txt"


f = open(filename,"r")
X = []
Y = []

for line in f:
        line = line.strip('\n')  
        b = line.split(';')
        b[0] = float(b[0])
        b[1] = float(b[1])
        b[2] = float(b[2])
        b[3] = float(b[3])
        b[4] = float(b[4])
        b[5] = float(b[5])
        b[6] = float(b[6])
        b[7] = float(b[7])
        b[8] = float(b[8])
        b[9] = float(b[9])
        b[10] = float(b[10])
        b[11] = float(b[11])
        b[12] = float(b[12])
        b[13] = float(b[13])
        b[14] = float(b[14])
        b[15] = float(b[15])
        b[17] = int(b[17])
        X.append(b[:16])
        Y.append(b[17])

Len = len(X);
X = np.asmatrix(X)
Y = np.asarray(Y)

sizes = [0.8, 0.1, 0.1]
arr_index = int(sizes[0]*Len)
arr_index2_start = arr_index + 1
arr_index2_end = arr_index + int(sizes[1]*Len)
arr_index3_start = arr_index2_start + 1

"""
train_set_x = np.array(X[:arr_index])
train_set_y = np.array(Y[:arr_index])

val_set_x = np.array(X[arr_index2_start:arr_index2_end])
val_set_y = np.array(Y[arr_index2_start:arr_index2_end])

test_set_x = np.array(X[arr_index3_start:])
test_set_y = np.array(X[arr_index3_start:])

train_set = train_set_x, train_set_y
val_set = val_set_x, val_set_y
test_set = test_set_x, test_set_y
"""
x = T.dmatrix('x')
z = x
t_mat = function([x],z)

y = T.dvector('y')
k = y
t_vec = function([y],k)

train_set_x = t_mat(X[:arr_index].T)
train_set_y = t_vec(Y[:arr_index])
val_set_x = t_mat(X[arr_index2_start:arr_index2_end].T)
val_set_y = t_vec(Y[arr_index2_start:arr_index2_end])
test_set_x = t_mat(X[arr_index3_start:].T)
test_set_y = t_vec(Y[arr_index3_start:])

train_set = train_set_x, train_set_y
val_set = val_set_x, val_set_y
test_set = test_set_x, test_set_y

dataset = [train_set, val_set, test_set]

f = gzip.open('..\..\..\data\dex.pkl.gz','wb')
cPickle.dump(dataset, f, protocol=-1)
f.close()

pprint(train_set_x.shape)

print('Finished\n')
4

3 に答える 3

6

Theano チュートリアルのコードを独自のデータに適合させるために、.pkl ファイルは必要ありません。データ構造を模倣するだけで済みます。

クイックフィックス

次の行を探します。DBN.pyの 303 行目です。

datasets = load_data(dataset)
train_set_x, train_set_y = datasets[0]

train_set_x独自のと に置き換えますtrain_set_y

my_x = []
my_y = []
with open('path_to_file', 'r') as f:
    for line in f:
        my_list = line.split(' ') # replace with your own separator instead
        my_x.append(my_list[1:-1]) # omitting identifier in [0] and target in [-1]
        my_y.append(my_list[-1])
train_set_x = theano.shared(numpy.array(my_x, dtype='float64'))
train_set_y = theano.shared(numpy.array(my_y, dtype='float64'))

これを入力データと使用しているコードに合わせてください。

同じことがcA.pydA.pySdA.pyでも機能しますが、使用するのは のみtrain_set_xです。

n_ins=28 * 28mnist 画像サイズがハードコーディングされている場所などを探します。独自の列数に置き換え28 * 28ます。

説明

これは、Theano が使用できる形式でデータを配置する場所です。

train_set_x = theano.shared(numpy.array(my_x, dtype='float64'))
train_set_y = theano.shared(numpy.array(my_y, dtype='float64'))

shared()numpy 配列を、GPU で効率的に設計された Theano 形式に変換します。

dtype='float64'が Theano 配列で期待されています。

基本的なテンソル機能の詳細。

.pkl ファイル

.pkl ファイルは、データ構造を保存する方法です。

自分で作成できます。

import cPickle
f = file('my_data.pkl', 'wb')
    cPickle.dump((train_set_x, train_set_y), f, protocol=cPickle.HIGHEST_PROTOCOL)
f.close()

読み込みと保存の詳細。

于 2015-08-06T16:39:06.013 に答える
5

pickled ファイルは、トレーニング セット、検証セット、およびテスト セットの 3 つのリストのタプルを表します。(トレーニング、検証、テスト)

  • 3 つのリストのそれぞれは、イメージのリストと各イメージのクラス ラベルのリストから形成されたペアです。
  • 画像は、0 から 1 の間の 784 個 (28 x 28) の float 値の numpy 1 次元配列として表されます (0 は黒、1 は白を表します)。
  • ラベルは、画像が表す数字を示す 0 から 9 までの数字です。
于 2014-10-07T04:42:16.730 に答える
3

これは次のことに役立ちます。

from PIL import Image
from numpy import genfromtxt
import gzip, cPickle
from glob import glob
import numpy as np
import pandas as pd
Data, y = dir_to_dataset("trainMNISTForm\\*.BMP","trainLabels.csv")
# Data and labels are read 

train_set_x = Data[:2093]
val_set_x = Data[2094:4187]
test_set_x = Data[4188:6281]
train_set_y = y[:2093]
val_set_y = y[2094:4187]
test_set_y = y[4188:6281]
# Divided dataset into 3 parts. I had 6281 images.

train_set = train_set_x, train_set_y
val_set = val_set_x, val_set_y
test_set = test_set_x, val_set_y

dataset = [train_set, val_set, test_set]

f = gzip.open('file.pkl.gz','wb')
cPickle.dump(dataset, f, protocol=2)
f.close()

これは私が使用した機能です。ファイルの詳細に応じて変更される場合があります。

def dir_to_dataset(glob_files, loc_train_labels=""):
    print("Gonna process:\n\t %s"%glob_files)
    dataset = []
    for file_count, file_name in enumerate( sorted(glob(glob_files),key=len) ):
        image = Image.open(file_name)
        img = Image.open(file_name).convert('LA') #tograyscale
        pixels = [f[0] for f in list(img.getdata())]
        dataset.append(pixels)
        if file_count % 1000 == 0:
            print("\t %s files processed"%file_count)
    # outfile = glob_files+"out"
    # np.save(outfile, dataset)
    if len(loc_train_labels) > 0:
        df = pd.read_csv(loc_train_labels)
        return np.array(dataset), np.array(df["Class"])
    else:
        return np.array(dataset)
于 2014-12-23T04:19:04.490 に答える