如何将我的数据集放在.pkl文件中,使用"mnist.pkl.gz"中使用的确切格式和数据结构?

Joh*_*rit 9 python pickle mnist dbn theano

我正在尝试使用python中的Theano库对Deep Belief Networks进行一些实验.我使用此地址中的代码:DBN完整代码.此代码使用MNIST手写数据库.此文件已处于pickle格式.它是unicked in:

  • 动车组
  • valid_set
  • TEST_SET

在下面进一步展开:

  • 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')
Run Code Online (Sandbox Code Playgroud)

xag*_*agg 6

无需使用.pkl文件将Theano教程中的代码调整为您自己的数据.您只需要模仿他们的数据结构.

快速解决

寻找以下几行.这是DBN.py上的第303 .

datasets = load_data(dataset)
train_set_x, train_set_y = datasets[0]
Run Code Online (Sandbox Code Playgroud)

替换为您自己train_set_xtrain_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'))
Run Code Online (Sandbox Code Playgroud)

根据您输入的数据和您正在使用的代码进行调整.

同样的事情适用于cA.py,dA.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'))
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

关于加载和保存的更多细节.


anh*_*ng8 5

pickle文件代表3个列表的元组:训练集,验证集和测试集.(火车,val,测试)

  • 三个列表中的每一个是由图像列表和每个图像的类标签列表形成的对.
  • 图像表示为0到1之间的784(28 x 28)个浮点值的numpy 1维数组(0表示黑色,1表示白色).
  • 标签是0到9之间的数字,表示图像代表的数字.