如何使用TensorFlow实现这种神经网络架构?

我在这个领域是新手,可能这就是我感到困惑的原因。我无法得到所需的结果,因为准确率非常低,这意味着我做错了什么。

enter image description here

图中显示的是一个RNN结构,模型接收输入(x),通过NNAF(激活函数)处理,然后通过移位操作符将一个值传回以便在未来使用(与vRNN相同)。这个图表更像是控制理论中的动态系统。

import sklearnimport pandas as pdfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import LSTMimport matplotlib.pyplot as pltimport sklearn.model_selectionfrom tensorflow.keras import layersdata= pd.read_csv("u.csv")#print(data.head())plt.plot(data)plt.show()import tensorflowx=data.iloc[:,:3].valuesy=data.iloc[:,-1].valuesn_features = 1n_steps = 3x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x,y, test_size=0.1)xtr=x_train# create and fit the networkn_features = 1x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], n_features))model = Sequential()# expected input data shape: (batch_size, timesteps, data_dim)model = tensorflow.keras.Sequential()model.add(layers.Embedding(input_dim=3, output_dim=1))  # returns a sequence of vectors of dimension model.add(layers.SimpleRNN(2, return_sequences=True))  # returns a sequence of vectors of dimension model.add(layers.SimpleRNN(2))  # return a single vector of dimension 32model.add(Dense(1, activation='softmax'))model.compile(optimizer='adam', loss='mse')model.fit(x_train, y_train)x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], n_features))y_pred=model.predict(x_train)#print(x_train.shape)#print(y_train.shape)print(model.layers[0].get_weights()[0]) # W - input weightsprint(model.layers[0].get_weights()[1]) # U - recurrent weightsprint(model.layers[0].get_weights()[2]) # b - outputm=model.layers[0].get_weights()[0]   

回答:

如果你想使用PyTorch创建神经网络,存在多种类型的神经网络,以下是三种主要的构建块:

FFN :

  1. 前馈神经网络
  2. CNN : 卷积神经网络
  3. RNN : 循环神经网络(LSTM是RNN的一种类型,你可以使用下面的RNN代码并修改它以获得LSTM,如果你觉得困难,请告诉我,我会发布修改方法)

我们从FNN开始:FNN由三层组成:

  1. 输入层
  2. 隐藏层
  3. 输出层

在MNIST的情况下,每个输入层形状不同,并且各有其行为

  1. FNN : 平坦的28*28
  2. CNN : 通道,28,28 : 主要用于图像
  3. RNN : 每步输入28,总共28个时间步 : 用于时间序列数据类型 [视频,文本,音频]

FNN的代码是:

import torchimport torch.nn as nnfrom torch.autograd import Variableimport torchvision.datasets as dsetsimport torchvision.transforms as transformstrain_dataset = dsets.MNIST(root="./data",                            train=True,                            transform=transforms.ToTensor(),                            download=True                            )test_dataset = dsets.MNIST(root="./data",                           train=False,                           transform=transforms.ToTensor())batch_size=100n_iters = 3000n_epochs = n_iters / (len(train_dataset)/batch_size)n_epochs = int(n_epochs)train_dataloader = torch.utils.data.DataLoader(dataset=train_dataset,                                               batch_size=batch_size,                                               shuffle=True)test_dataloader = torch.utils.data.DataLoader(dataset=test_dataset,                                              batch_size=batch_size,                                              shuffle=False)class FeedforwardNNModelSIG(nn.Module):  def __init__(self,input_dim,hidden_dim,output_dim):      super().__init__()      #线性层      self.fc1=nn.Linear(input_dim,hidden_dim)      #非线性层       self.sigmoid=nn.Sigmoid()      #线性层(输出层)      self.fc2=nn.Linear(hidden_dim,output_dim)  def forward(self,x):      # 线性      out = self.fc1(x)      # 非线性      out = self.sigmoid(out)      # 线性(输出层)      out = self.fc2(out)      return outinput_dim=28*28hidden_dim=50output_dim=10model = FeedforwardNNModelSIG(input_dim,hidden_dim,output_dim)criterion = nn.CrossEntropyLoss()learning_rate = 0.1optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)iter=0for epoch in range(n_epochs):  for i,(images, labels) in enumerate(train_dataloader):      ##1 将输入/标签转换为变量      images = Variable(images.view(-1,28*28))      labels = Variable(labels)      ##2 清除梯度       optimizer.zero_grad()      ##3 获取给定输入的输出      outputs = model(images)      ##4 获取损失      loss = criterion(outputs,labels)      ##5 获取相对于参数的梯度      loss.backward()      ##6 使用梯度更新参数      optimizer.step()      ##7 重复      iter +=1      if iter % 500 == 0 :        correct = 0.        total = 0.      # 遍历测试数据集        for images,labels in test_dataloader:          images = Variable(images.view(-1,28*28))          labels = Variable(labels)          outputs = model(images)          # 获取预测的最大值          _,predicted=torch.max(outputs.data,1)          # 标签的数量           total += labels.size(0)          # 总正确预测          correct += (predicted==labels).sum()        accuracy = 100*(correct/total)        print("Iteration: {} , Loss:{} , Accuracy:{}".format(iter,loss.data,accuracy))

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注