我正在建立一个自动编码器网络来查找文本中的异常值。
我首先构建了一个numpy数组,其输入表示为ascii文本,但我无法将它们取回。
我的输入看起来像这样:
fab_shadow_black.9.png
fab_shadow_dark.9.png
fab_shadow_light.9.png
fastscroller_handle_normal.xml
fastscroller_handle_pressed.xml
folder_fab.png
ic_account_circle_grey_24dp.xml
ic_action_cancel_light.png
我的整个代码如下:
import sys
from keras import Input, Model
import matplotlib.pyplot as plt
from keras.layers import Dense
import numpy as np
from pprint import pprint
from google.colab import drive
drive.mount('/content/drive')
with open('/content/drive/My Drive/Colab Notebooks/drawables.txt', 'r') as arquivo:
dados = arquivo.read().splitlines()
def tamanho_maior_elemento(lista):
maior = 0
for elemento in lista:
tamanho_elemento = len(elemento)
if tamanho_elemento > maior:
maior = tamanho_elemento
return maior
def texto_para_ascii(lista, tamanho_maior_elemento):
lista_ascii = list()
for elemento in lista:
elemento_ascii_lista = list()
elemento_com_zeros = elemento.ljust(tamanho_maior_elemento, "0")
for caractere in elemento_com_zeros:
elemento_ascii_lista.append(ord(caractere))
lista_ascii.append(elemento_ascii_lista)
return lista_ascii
def ascii_para_texto(lista):
lista_ascii = list()
for elemento in lista:
elemento_ascii_lista = list()
for caractere in elemento:
elemento_ascii_lista.append(chr(caractere))
elemento_ascii_string = "".join(elemento_ascii_lista)
lista_ascii.append(elemento_ascii_string)
return lista_ascii
tamanho_maior_elemento = tamanho_maior_elemento(dados)
tamanho_lista = len(dados)
dados_ascii = texto_para_ascii(dados, tamanho_maior_elemento)
np_dados_ascii = np.array(dados_ascii)
tamanho_comprimido = int(tamanho/5)
dados_input = Input(shape=(tamanho_maior_elemento,))
hidden = Dense(tamanho_comprimido, activation='relu')(dados_input)
output = Dense(tamanho_maior_elemento, activation='relu')(hidden)
resultado = Dense(tamanho_maior_elemento, activation='sigmoid')(output)
autoencoder = Model(input=dados_input, output=resultado)
autoencoder.compile(optimizer='adam', loss='mse')
history = autoencoder.fit(np_dados_ascii, np_dados_ascii, epochs=10)
plt.plot(history.history["loss"])
plt.ylabel("Loss")
plt.xlabel("Epoch")
plt.show()
saida_predict = autoencoder.predict(np_dados_ascii)
saida_lista = saida_predict.tolist()
pprint(saida_predict)
pprint(saida_lista)
我的输入是一个numpy数组,每个字符串都表示为用0右填充的ascii数字。
问题在于,predict的输出中有很多介于0和1之间的值,我无法将其转换回文本。
array([[1. , 0.9999999 , 1. , ..., 1. , 1. ,
1. ],
[0.99992466, 1. , 1. , ..., 1. , 1. ,
1. ],
[1. , 0.99999994, 1. , ..., 1. , 1. ,
1. ],
...,
[0.9999998 , 0.9999999 , 1. , ..., 1. , 1. ,
0.9999999 ],
[1. , 0.9999998 , 1. , ..., 1. , 1. ,
1. ],
[0.9999999 , 0.99999994, 1. , ..., 1. , 1. ,
1. ]], dtype=float32)
我应该得到一个包含ascii数字的数组,就像我在输入中输入的一样,我出了什么问题?
答案 0 :(得分:1)
在您的代码中,
resultado = Dense(tamanho_maior_elemento, activation='sigmoid')(output)
您使用了S形激活,因此预测范围在0到1之间。尝试通过线性激活更改它。
resultado = Dense(tamanho_maior_elemento)(output)
对于线性激活,您无需在激活中分配任何内容,因为here提到默认情况下是线性激活。