python - 使用 keras 的解密器
问题描述
我正在用 python3 制作一个带有神经网络的解密器,这是我到目前为止所做的:
from sklearn.model_selection import train_test_split
import numpy as np
import keras
from keras.models import Sequential
from keras.layers.core import Dense
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import csv
LE = LabelEncoder()
dado = pd.read_csv('teste.csv', header=None)
print("codigo:",dado)
dado = LE.fit_transform(dado)
np.random.seed(2)
classification = 26
dataset = pd.read_csv('base.csv', header=None)
print("letras:",dataset[0])
print("\n")
print("codigo:",dataset[1])
print("\n")
dataset[0] = LE.fit_transform(dataset[0])
dataset[1] = LE.fit_transform(dataset[1])
print("letras:",dataset[0])
print("\n")
print("codigo:",dataset[1])
# Define dados de treinamento
X = dataset[0].values
#print("x: ",X)
# Define a saida padrao
Y = dataset[1].values
#print("\ny: ",Y)
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.66, random_state=5)
#print("x_train:", x_train,"\n x_test:", x_test, "\ny_train:",y_train,"\ny_test:",y_test)
y_train = keras.utils.to_categorical(y_train-1, classification)
y_test = keras.utils.to_categorical(y_test-1, classification)
#print("\ny_train:",y_train,"\ny_test: ",y_test)
# A rede será uma MLP com duas entradas, uma camada intermediária com 3 neurônios e
# uma camada de saída com um neurônio.
model = Sequential()
model.add(Dense(26, input_dim=1, activation='relu'))
model.add(Dense(classification, activation='softmax'))
# Mostra os parâmetros da RNA
#model.summary()
#
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['binary_accuracy'])
print("OK")
# Executa o treinamento da MLP
model.fit(x_train, y_train, batch_size=1, epochs=1000, validation_data=(x_test, y_test))
# Executa a MLP após o treinamento
#print(model.predict(X))
#print(model.predict(dado))
prediction =model.predict(dado)
print("prediction: ",prediction)
#pred_name = dado[np.argmax(prediction)]
我正在使用 base.csv 来训练:
A,'@'
B,'#'
C,'$'
D,'%'
E,'&'
F,'*'
G,'1'
H,'2'
I,'3'
J,'4'
K,'5'
L,'6'
M,'7'
N,'8'
O,'9'
P,'0'
Q,a
R,b
S,c
T,d
U,e
V,f
X,g
W,h
Y,i
Z,j
我想解密例如这条消息:
'@e*c$&7e3d96&1@7'
显然训练是正确的,我收到了 predict() 的值,我会放一些:
[1.67683919e-03 1.00730495e-05 3.00646033e-02 3.47359193e-04
7.34448224e-10 2.07794699e-07 6.91458354e-07 9.16662440e-02
1.12631470e-01 1.55544106e-03 1.33347882e-07 1.26970816e-08
1.17909266e-07 2.84538746e-01 2.04548487e-04 4.61375207e-01
4.84018710e-06 6.99752900e-06 1.09326131e-04 4.26771911e-03
2.73230253e-03 1.45343272e-03 1.31152268e-03 5.98493521e-09
3.70860286e-03 2.33352231e-03]
[1.35914271e-03 6.58475028e-06 2.74186116e-02 2.63669877e-04
3.23479521e-10 1.15685609e-07 4.04968659e-07 8.76267478e-02
1.08614832e-01 1.25834497e-03 7.29217859e-08 6.29246166e-09
6.41369695e-08 2.85867929e-01 1.51908389e-04 4.74235952e-01
3.07537766e-06 4.51551887e-06 7.91385319e-05 3.59652541e-03
2.26239045e-03 1.17159961e-03 1.05227530e-03 2.87827917e-09
3.10653565e-03 1.91950181e-03]]
这是加密文件的输入代码:
dado = pd.read_csv('teste.csv', header=None)
dado = LE.fit_transform(dado)
我如何将 predict() 结果显示回字符以破译消息?
解决方案
您不能只是通过向后传递网络将数据恢复为原始数据。您需要训练另一个神经网络将数据转换回原始数据。为你的第二个网络提供数据y_train
并让它预测你的x_train
样子:
another_model.fit(y_train, x_train, ...)
唯一的另一种方法是使用GAN,TensorFlow 提供了一个很棒的教程!
推荐阅读
- javascript - 不同计算机上的纪元日期转换结果不同
- r - 在用户创建的函数中对公式语法使用 quasiquotation?
- java - 如何将 log4j2.xml 从文件配置到标准输出?
- javascript - REGEX - 从字符串中删除小数
- swift - 如何为底部安全区域的列表视图添加背景颜色SwiftUI iOS 14
- macos - 为什么 nkf 命令从 UTF8-MAC 转换为 UTF8 时会删除一个字符?
- javascript - Firestore != 查询错误:'"!="' 类型的参数不可分配给 'WhereFilterOp'.ts(2345) 类型的参数
- google-cloud-platform - 使用 Cloud Run 运行 AI Platform Notebook
- wpf - WPF:如何防止程序启动时数据触发动画?
- wordpress - 扩展插件的 WordPress 操作