Automatizar la apertura de un archivo hdf5Hola,
Estoy tratando de crear un script .jsl que importará los archivos hdf5 de Tensorflow, identificará cuántos archivos hay (núcleos + sesgo) y los guardará como tablas de datos para luego traducirlo a un formulario legible y utilizable como sustituto de JMP. La forma en que abro las tablas de datos hasta ahora es muy manual; yo suelo
Open( "filename.h5", {"list_of", "dataset_names"});
para importar todos los nombres de conjuntos de datos. Sin embargo, para poder trabajar con las tablas de datos, estoy usando esta forma manual (esto es para una ANN de 2 capas de Keras, la última capa de kernel y bias concatena a las demás):
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();
Lo que quiero hacer es automatizar el proceso de importación, guardar las tablas de datos, cambiarles el nombre y comprender cuántas capas hay en el modelo de Keras (número de tablas de datos / 2). ¿Hay alguna manera de entender cuántas tablas de datos hay y también cambiar el nombre de cada una por separado sin tener que hacer el proceso manual que se muestra arriba?
¡Gracias!
Re: Automatizar la apertura de un archivo hdf5Lo siento, Bob, pero no tengo ese código de muestra ni el tiempo para desarrollarlo en este momento.
Brian
Re: Automatizar la apertura de un archivo hdf5Hola Brian,
Solo encontré una forma de generar un archivo HDF5 desde Python que JMP puede leer directamente en formato de tabla... lo que significa que el asistente de GUI no me pregunta qué subconjunto(s) de la estructura HDF cargar.No quiero pegar todo el código, pero la ruta básica es convertir el marco de datos de Pandas en un recarray de Numpy y escribirlo en HDF5.
PERO... es absurdamente lento abrir este archivo .H5 en JMP.Para un archivo de tamaño moderado (131 000 filas x 500 columnas), es aproximadamente 10 veces más lento que los mismos datos almacenados como CSV.
¿Puede proporcionar un código Python de ejemplo que almacene datos similares a tablas en un archivo HDF5 que JMP pueda interpretar y abrir directamente, con un rendimiento razonable para el volumen de datos?O un módulo de Python que escriba un archivo .JMP sería genial.
La interfaz de Python parece guardar el marco de datos de Pandas como .csv para abrir en JMP... con suerte, eso no es porque .csv es el intermediario más rápido.
Gracias,
- Beto
Re: Automatizar la apertura de un archivo hdf5Desafortunadamente todavía no he encontrado una solución a esto. No es la característica principal de mi aplicación, así que no me molestaré más. ¡Pero si me tropiezo con algo lo informaré seguro!
Re: Automatizar la apertura de un archivo hdf5Si encuentro la solución a esto seguro que la compartiré. Sin embargo, hasta ahora no hubo suerte.
Re: Automatizar la apertura de un archivo hdf5Tiene razón, ya que JMP asume que .h5 es la única extensión para un archivo HDF5.Esta parece ser la norma, pero .hdf5 y .hdf son alternativas aceptadas.Veremos cómo obtener el cuadro de diálogo de archivo y los comandos abiertos de JSL para admitir las extensiones .hdf5 y .hdf en JMP 15.2. Ciertamente será en 16.0.
Brian Corcorán
JMP Desarrollo
Re: Automatizar la apertura de un archivo hdf5En realidad, otra pregunta aquí: parece que JMP asume que un archivo HDF5 usará la extensión 'h5'. Si mis archivos tienen una extensión diferente, digamos 'hdf5', ¿puedo obligar a JMP a usar ese tipo de archivo con el comando Abrir()? El argumento File Type() no parece funcionar para HDF5.Re: Automatizar la apertura de un archivo hdf5Gracias por la respuesta. Al menos para mí, si pudiera consultar la estructura del archivo HDF5, estaría feliz de escribir el resto yo mismo.Re: Automatizar la apertura de un archivo hdf5JMP realmente no proporciona un conjunto completo de funciones JSL para HDF5 en este momento.Tenemos solicitudes de funciones abiertas para agregar compatibilidad con JSL para consultar nombres de tablas y fusionar conjuntos de datos similares.Estamos considerando estas adiciones para el futuro.Si hay soporte más allá de esto que cree que sería útil, comuníqueselo al soporte técnico y nos ayudará a priorizar el trabajo futuro.
Gracias, y siento que no podamos ser de más ayuda en este momento.
Brian Corcorán
JMP Desarrollo
Re: Automatizar la apertura de un archivo hdf5Hola,
También estoy buscando hacer algo similar con los archivos hdf5: obtener el número y los nombres de los 'conjuntos de datos' y hacer algo inteligente con ellos. Como estoy seguro de que ha descubierto, la documentación es bastante escasa en esta área. Envié un correo electrónico al soporte de jmp para preguntar sobre cómo hacer esto, si escucho algo, lo publicaré aquí. Si termina resolviendo esto usted mismo, ¿podría compartir su (s) solución (es)?
¡Gracias!Re: Automatizar la apertura de un archivo hdf5Discusión 2024, tema similar:
Ayuda para abrir archivos hdf5
Re: Automatizar la apertura de un archivo hdf5Hasta la versión 17 de JMP, el marco de datos de Pandas se guarda como un archivo CSV. JMP 18, con su compatibilidad con Python incorporada, puede crear una tabla de datos en la memoria a partir de un marco de datos de Pandas. En la versión 18, debe iterar a través del marco de datos y crear una columna de tabla de datos de JMP a la vez.
En la próxima versión JMP 19 EA-5 se ofrecerá un mejor soporte de marcos de datos.
El paquete Python para trabajar con archivos HDF5 es h5py.
Re: Automatizar la apertura de un archivo hdf5Tuve un poco de tiempo para hacer experimentos. Aquí hay un script de Python que utiliza paquetes de importación jmp y h5py para abrir 'Big Class.jmp', crear un archivo 'Big Class.h5' y, a partir de ahí, crear una tabla de datos dt2 a partir del archivo .h5.
# 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)