神经网络/自编码器的实现(向量化Python版本实现)

神经网络/自编码器的实现(向量版本)

# -*- coding: utf-8 -*-
"""
Created on Tue Jan  2 17:47:29 2018

@author: lyh
"""
import numpy as np
from sklearn.preprocessing import MinMaxScaler

#激活函数
def tanh(x):
    return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))

#激活函数 tanh导数
def d_tanh(x):
    return 1 + np.negative(np.square(tanh(x)))

#计算cost
def cost(a,y):
    return np.negative(y * np.log(a)) + ((1 + np.negative(y)) * np.log(1 + np.negative(a)))

#计算dA
def da(a,y):
    return np.negative(y / a) + ((1 + np.negative(y)) / (1 + np.negative(a)))

#自定义多层神经网络
def neuralNetwork(l,n,X,y,lr,iterations):
    """
    loss function: -ylogy_hat + (1-y)log(1-y_hat)
    params:
        l : The number of layers
        n : The number of nodes on each layer
        X : x
        y : y
        lr : learning rate
        iterations : Number of iterations
    """
    A = [X]
    W,b,Z = [0],[0],[0]
    dZ,dA,dW,db = [0],[0],[0],[0]
    m = X.shape[1]
    loss = 1000
    #初始化
    for i in range(1,l):
        W.append(np.random.rand(n[i],n[i-1]))
        b.append(np.random.rand(n[i]).reshape(n[i],1))
        A.append(0)
        Z.append(0)
        dZ.append(0)
        dA.append(0)
        dW.append(0)
        db.append(0)

    for index in range(iterations):
        #前馈传播
        for i in range(1,l):
            Z[i] = np.dot(W[i],A[i-1]) + b[i].reshape(len(b[i]),1)
            A[i] = tanh(Z[i])

        #最后一层dA
        """
        if((np.isnan(np.mean(cost(A[l-1], y)))) | (np.mean(cost(A[l-1], y)) == loss)):
            print("迭代停止")
            #break
        else:"""
        loss = np.mean(cost(A[l-1], y))
        print(index,loss)
        dA[l-1] =  da(A[l-1], y)

        #反向传播
        for i in range(1,l):
            layer = l-i
            dZ[layer] = dA[layer] * d_tanh(Z[layer]) #对应元素相乘
            dW[layer] = 1/m * (np.dot(dZ[layer], A[layer-1].T))
            db[layer] = 1/m * np.sum(dZ[layer], axis=1, keepdims=True)
            dA[layer - 1] = np.dot(W[layer].T, dZ[layer])

            #更新权值
            W[layer] -= lr * dW[layer]
            b[layer] -= lr * db[layer]

    return A,W,b

#构造自编码器   
def AutoEncoder(X,n,lr,it):
    """
    loss function: -ylogy_hat + (1-y)log(1-y_hat)
    params:
        n : The number of nodes on each layer
        X : x
        lr : learning rate
        iterations : Number of iterations
    """
    row = X.shape[0]
    col = X.shape[1]
    X = X.reshape(row * col,1)
    l = len(n)
    scaler = MinMaxScaler().fit(X)
    X_scaler = scaler.transform(X)
    print(X_scaler.shape)
    print("input ",X)
    #print("归一化 ",X)
    A,W,b = neuralNetwork(l,n,X_scaler,X_scaler,lr,it)
    print("AutoEncoder output ",scaler.inverse_transform(A[l-1]).reshape(row,col))

#X = np.array([5,5,10,1,5,9,7,4,6,8])
#X = X.reshape(len(X),1)
#测试
from sklearn import datasets
iris = datasets.load_iris()
data = iris["data"]

X = data
row = X.shape[0]
col = X.shape[1]

AutoEncoder(X,[row * col,2,row * col],0.05,100)

此版本目前存在一个Bug 在自编码器中,当对输入标准化之后,等于或接近零的数值在还原之后变成了负数。 解释半天找不到原因,有没有大佬知道是什么原因的,欢迎指出问题所在,谢谢。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个技术问题,我可以为您提供一些参考资料或者建议,但请注意,我只是一个AI语言模型,并不是专业的程序员或者数据科学家。您可以参考一些经典的降维算法,比如PCA、LDA、t-SNE等等,或者利用深度学习中的自编码器实现降维。具体实现细节还需要根据您的具体需求和数据情况来进行调整和优化。 ### 回答2: 实现神经网络编码器可以使用Python编程语言和深度学习库,例如TensorFlow或PyTorch。下面是一个示例程序,用于使用全连接神经网络降维39维的数据到任意维度: ```python import tensorflow as tf # 创建神经网络编码器模型 def encoder(input_dim, output_dim): model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dense(output_dim) ]) return model # 定义输入和输出维度 input_dim = 39 # 输入维度为39 output_dim = 10 # 输出维度为10 # 创建神经网络编码器 model = encoder(input_dim, output_dim) # 编译模型 model.compile(optimizer='adam', loss='mse') # 创建输入数据(随机数据用于示例) input_data = tf.random.normal((1, input_dim)) # 训练模型 model.fit(input_data, input_data, epochs=10) # 降维维度为5 dim_to_reduce = 5 # 创建维度降低模型 reduced_model = encoder(input_dim, dim_to_reduce) # 从已经训练的模型中获取权重 reduced_model.set_weights(model.get_weights()) # 使用降维模型对输入数据进行降维 reduced_data = reduced_model.predict(input_data) print(reduced_data.shape) # 输出为(1, 5) ``` 这个示例程序使用一个简单的全连接神经网络模型作为编码器,使用均方误差作为损失函数进行训练。训练模型时,输入和输出都是输入数据,以最大程度地保留原始数据的信息。然后,通过创建一个新的神经网络模型,将输出维度设置为所需的降维维度,然后从已训练的编码器模型中获取权重,并将其应用于新的模型,以实现将39维数据降维到5维。最后,使用降维模型对输入数据进行预测,得到降维后的输出数据。 ### 回答3: 编写神经网络编码器实现数据降维可以参考以下步骤: 1. 定义神经网络结构:可以选择使用深度神经网络(例如多层感知机)或者自编码器作为编码器结构。根据问题中所述,输入维度为39,输出维度可根据需求进行指定。 2. 准备训练样本:选择合适的数据集,确保数据集中的每个样本都是39维的向量,并将其进行预处理和归一化。 3. 编写代码实现神经网络:使用常见的深度学习框架(如Tensorflow、PyTorch等)编写神经网络代码。根据选择的网络结构和框架,设置合适的输入和输出维度,并添加相应的网络层、激活函数和优化器等。 4. 数据训练和优化:分割数据集为训练集和验证集,并使用训练集对神经网络进行训练。通过调整神经网络的超参数(如学习率、批次大小等)和网络结构,进行多次迭代训练以优化模型。 5. 评估模型性能:使用验证集对训练好的模型进行评估,根据评估结果调整模型和超参数。 6. 进行降维:通过输入39维的数据样本,使用训练好的模型进行前向传播计算,将其编码成指定维度的向量,实现数据降维。可以选择编码器的某一层作为输出,或者使用整个编码器作为降维器。 7. 测试模型:使用降维后的数据进行进一步的分析、可视化或应用。 需要注意的是,神经网络编码器的性能和降维效果与网络结构、数据集质量、模型训练等因素有关,因此需要综合考虑这些因素来调整模型,以获得满意的降维结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值