hdf5 ファイルを開く自動化こんにちは、
Tensorflow から hdf5 ファイルをインポートし、そこにあるファイルの数 (カーネル + バイアス) を特定し、それらをデータテーブルとして保存して、JMP によるサロゲートとして読み取り可能で使用可能な形式に変換する .jsl スクリプトを作成しようとしています。 これまでのところ、データテーブルを開く方法は非常に手動です。私が使う
Open( "filename.h5", {"list_of", "dataset_names"});
すべてのデータセット名をインポートします。 ただし、データテーブルを操作できるようにするために、この手動の方法を使用しています (これは Keras 2 層 ANN 用で、最後のカーネルとバイアス層が他の層を連結します):
layer_0_bias = Data Table( "-model_weights-dense-dense-bias-0" ) << Get As Matrix();
layer_0_kernel = Data Table( "-model_weights-dense-dense-kernel-0" ) << Get As Matrix();
layer_1_bias = Data Table( "-model_weights-dense_1-dense_1-bias-0" ) << Get As Matrix();
layer_1_kernel = Data Table( "-model_weights-dense_1-dense_1-kernel-0" ) << Get As Matrix();
layer_2_bias = Data Table( "-model_weights-dense_2-dense_2-bias-0" ) << Get As Matrix();
layer_2_kernel = Data Table( "-model_weights-dense_2-dense_2-kernel-0" ) << Get As Matrix();
私がやりたいことは、データテーブルのインポート、保存、名前変更のプロセスを自動化し、Keras モデルのレイヤー数 (データテーブルの数 / 2) を理解することです。 上記の手動プロセスを実行せずに、データテーブルがいくつあるかを理解し、それぞれの名前を個別に変更する方法はありますか?
ありがとう!
Re: hdf5 ファイルを開くのを自動化する申し訳ありませんが、私はそのようなサンプル コードを持っていませんし、実際に開発する時間もありません。
ブライアン
Re: hdf5 ファイルを開くのを自動化するこんにちはブライアン、
Python から HDF5 ファイルを生成し、JMP がテーブル形式に直接読み込むことができる方法を 1 つだけ見つけました。つまり、GUI ウィザードは HDF 構造のどのサブセットを読み込むかを尋ねません。すべてのコードを貼り付けたくはありませんが、基本的なパスは、Pandas データフレームを Numpy 再配列に変換し、これを HDF5 に書き込むことです。
しかし...この.H5ファイルをJMPで開くのはとてつもなく遅いです。中程度のサイズのファイル (131k 行 x 500 列) の場合、CSV として保存された同じデータよりも約 10 倍遅くなります。
テーブルのようなデータを HDF5 ファイルに格納し、JMP が解釈して直接開くことができる Python コードの例を提供していただけますか?または、.JMP ファイルを書き込む Python モジュールが最適です。
Python インターフェイスは、Pandas のデータフレームを .csv として保存して JMP で開くように見えます...うまくいけば、.csv が最速の仲介者だからではありません。
ありがとう、
- ボブ
Re: hdf5 ファイルを開くのを自動化する残念ながら、私はまだこれに対する解決策を見つけていません。 これは私のアプリケーションの主な機能ではないので、もう気にしません。 でも、何かにぶつかったら必ず知らせます!
Re: hdf5 ファイルを開くのを自動化するこれに対する解決策が確実に見つかったら、共有します。 ただし、これまでのところ運がありません。
Re: hdf5 ファイルを開くのを自動化するJMP は .h5 が HDF5 ファイルの唯一の拡張子であると想定しているという点で、あなたは正しいです。これは標準のようですが、.hdf5 と .hdf が代替として受け入れられています。JMP 15.2 で .hdf5 および .hdf 拡張子をサポートするために、ファイル ダイアログと JSL オープン コマンドを取得する方法について説明します。確かにそれは16.0になります。
ブライアン・コーコラン
JMP開発
Re: hdf5 ファイルを開くのを自動化する実際、ここで別の質問があります。JMP は、HDF5 ファイルが拡張子「h5」を使用すると想定しているようです。 ファイルの拡張子が「hdf5」のように異なる場合、JMP で Open() コマンドを使用して強制的にそのファイル タイプを使用することはできますか? File Type() 引数は、HDF5 では機能しないようです。Re: hdf5 ファイルを開くのを自動化する返信いただきありがとうございます。 少なくとも私にとっては、HDF5 ファイルの構造を照会できれば、喜んで残りの部分を自分でスクリプト化します。Re: hdf5 ファイルを開くのを自動化する現時点では、JMP は実際には HDF5 用の豊富な JSL 機能セットを提供していません。テーブル名をクエリし、データセットのようにマージするための JSL サポートを追加する機能リクエストを公開しています。これらの追加については、将来的に検討しています。これを超えて役立つと思われるサポートがある場合は、その旨をテクニカル サポートにお知らせください。今後の作業の優先順位を決定するのに役立ちます。
ありがとうございます。申し訳ありませんが、今はこれ以上お役に立てません。
ブライアン・コーコラン
JMP開発
Re: hdf5 ファイルを開くのを自動化するやあ、
私はまた、hdf5ファイルで同様のことをしようとしています.「データセット」の数と名前を取得し、それを使って何かインテリジェントなことをします. お気づきだと思いますが、この分野のドキュメントは非常にまばらです。 jmpサポートにメールして、これを行うことについて尋ねました.何か返事があれば、ここに投稿します. これを自分で理解することになった場合は、解決策を共有していただけますか?
ありがとう!Re: hdf5 ファイルの自動オープン2024年の議論、類似トピック:
HDF5ファイルを開く際のヘルプ
Re: hdf5 ファイルの自動オープンJMP 17 までは、パンダ データ フレームを CSV ファイルとして保存していました。Python サポートが組み込まれた JMP 18 では、パンダ データ フレームからメモリ内にデータ テーブルを作成できます。18 では、データ フレーム全体を反復処理し、一度に JMP データ テーブル列を構築する必要があります。
今後リリースされる JMP 19 EA-5 では、より優れたデータ フレーム サポートが提供されます。
HDF5 ファイルを操作するための Python パッケージは h5py です。
Re: hdf5 ファイルの自動オープン少し時間があったので、いじってみました。以下は、 jmpとh5py のインポート パッケージを使用して 'Big Class.jmp' を開き、'Big Class.h5' ファイルを作成し、そこから .h5 ファイルから dt2 データ テーブルを作成する Python スクリプトです。
# File: h5_example.py
# Author: Paul R. Nelson
# Description: Example showing use of h5py and jmp packages to
# create a .h5 file from a JMP data table, and recreate the JMP
# table from the .h5 file. Note: the HDF5 file doesn't preserve
# column order so the new table comes back in alphabetic order
#
# Layout of my .h5 file - using a generic layout so it can always be easily read
# regardless of name.
# Other attrs could be added as needed.
# /table/ group 'table' has attrs['name'] = table name
# /table/col_name
# /table/...
# /table/nth_col_name
#
# /scripts/script_name
# ...
# /scripts/nth_script_name
#
import jmp
#from jmputils import jpip
#jpip('install', 'h5py')
import numpy as np
import h5py as h5
#callable function to use with h5py file.visit()
def printname(name):
print(name)
# Build a hdf5 file from JMP data table. HDF5 is like NumPy and each dataset
# must be homogeneous, so a JMP like table needs to be multiple datasets.
# To make it easy, a dataset per column.
def h5_from_dt(file_path, dt):
"""Build and save an .h5 file at at file_path/dt_name.h5 from dt"""
try:
f = h5.File( file_path + dt.name + '.h5', 'w')
h_tbl = f.create_group( 'table' ) # table data
h_script = f.create_group('scripts') # table scripts
h_tbl.attrs["name"] = dt.name
for col in dt:
if col.dtype == jmp.DataType.Character:
ds = h_tbl.create_dataset( col.name, shape=len(col), dtype=h5.string_dtype())
# I'm cheating - I'm saving the JMP data type so read can determine char type
ds.attrs['jtype'] = 'jmp_Character'
elif col.dtype == jmp.DataType.Numeric:
ds = h_tbl.create_dataset( col.name, shape=len(col), dtype='f8' )
ds.attrs['jtype'] = 'jmp_Numeric'
ds[:] = dt[col.name] # assign dt values to dataset
except Exception as err:
print(f'Error: {err}')
f.close()
return None
return f
def dt_from_h5(file_path):
"""Create a data table from an .h5 file turning datasets to JMP columns"""
f = h5.File(file_path, 'r')
if f and 'table' in f.keys():
print('A dt like h5.')
tbl = f['table']
cols = tbl.keys()
if cols:
print(cols)
col_name = list(cols)[0]
dt = jmp.DataTable('dt2', rows=len( tbl[ col_name ] ) )
for cname in cols:
c = tbl[cname]
print(c)
print(c.dtype)
# My cheat on knowing utf-8 char columns
if c.attrs['jtype'] and c.attrs['jtype'] == 'jmp_Character':
print('char col')
dt.new_column(cname, jmp.DataType.Character)
for x in range( len( c )):
# need to turn byte object back to utf-8 string
dt[cname][x] = c[x].decode('utf-8')
else:
dt.new_column(cname, jmp.DataType.Numeric)
dt[cname] = c
f.close()
return dt
else:
f.close()
return None
f.close()
return None
# open 'Big Class'
dt = jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
try:
# create 'Big Class.h5' file in my home directory
hdf = h5_from_dt(jmp.HOME, dt)
if hdf:
print(list(hdf.keys()))
hdf.visit(printname)
h_tbl = hdf['table']
print( f'Table Name: {h_tbl.attrs['name']}')
print( hdf['table/name'])
print( [x.decode('utf-8') for x in hdf['table/name'] ])
print( hdf[ 'table/weight'])
print( [x.item() for x in hdf['table/weight'] ] )
else:
print('Unable to create .h5 file from data table.')
except Exception as err:
print(f'Error: {err}')
finally:
if hdf:
hdf.close()
dt2 = dt_from_h5( jmp.HOME + 'Big Class.h5')
print(dt2)